You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解构npm模块interfaces返回的网络适配器数据?

问题:使用interfaces模块提取网卡address属性失败,报错TypeError

问题描述

我使用npm的interfaces模块获取网络适配器详情,它返回类JSON结构的数据。我想要提取address等特定属性,但解析数据时遇到困难。返回的数据示例如下:

{
  'Ethernet 1': [
    {
      address: 'ffff::ffff:ffff:ff:ffff',
      netmask: 'ffff:ffff:ffff:ffff::',
      family: 'IPv6',
      mac: '00:00:00:00:00:00',
      internal: false,
      cidr: 'ffff::ffff:ffff:ff:ffff/64',
      scopeid: 7
    },
    {
      address: '10.0.0.1',
      netmask: '255.255.255.192',
      family: 'IPv4',
      mac: '00:00:00:00:00:00',
      internal: false,
      cidr: '10.0.0.1/26'
    }
  ],
  'Loopback Pseudo-Interface 1': [
    {
      address: '::1',
      netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
      family: 'IPv6',
      mac: '00:00:00:00:00:00',
      internal: true,
      cidr: '::1/128',
      scopeid: 0
    },
    {
      address: '127.0.0.1',
      netmask: '255.0.0.0',
      family: 'IPv4',
      mac: '00:00:00:00:00:00',
      internal: true,
      cidr: '127.0.0.1/8'
    }
  ]
}

我尝试将数据序列化/解析为数组,但不知道如何不使用特定适配器名称(如'Ethernet 1')来获取第一个对象。我的代码如下:

const interfaces = require('interfaces');
const netinterfaces = JSON.stringify(interfaces());
const results = JSON.parse(netinterfaces);

app.get('/nettest', (req, res) => {

   const {results: {adapter:[{address}]}} =results;
   console.log(address);
   console.log(results);
   res.send(results);
})

运行时报错:

TypeError: Cannot read properties of undefined (reading 'adapter')


解决方法

你的代码存在两个核心问题:

  1. 多余的JSON序列化/解析:interfaces()返回的本身就是JavaScript对象,不需要转成JSON字符串再解析,这一步完全没必要。
  2. 错误的解构赋值逻辑:你试图通过不存在的adapter属性取值,自然会报错。要不依赖适配器名称获取数据,需先提取对象的所有值组成数组。

修正后的代码

const interfaces = require('interfaces');
// 直接使用返回的对象,无需JSON转换
const results = interfaces();

app.get('/nettest', (req, res) => {
  // 提取所有适配器的地址数组,组成新数组
  const adapterList = Object.values(results);
  // 安全获取第一个适配器的第一个地址对象(用可选链避免空数组报错)
  const firstAddressObj = adapterList[0]?.[0];
  
  if (firstAddressObj) {
    console.log(firstAddressObj.address);
    res.send(firstAddressObj.address);
  } else {
    res.send('未找到可用的网络适配器地址');
  }
});

关键逻辑说明

  • Object.values(results):将适配器对象的所有值(每个值对应一个适配器的地址数组)提取为数组,彻底摆脱对具体适配器名称的依赖。
  • adapterList[0]?.[0]:使用可选链操作符?.,当adapterList为空或者第一个适配器数组为空时,不会抛出错误,而是返回undefined,避免程序崩溃。

扩展:获取所有适配器的所有address

如果需要收集所有适配器的所有地址,可以用数组遍历实现:

const allAddresses = Object.values(results).flatMap(adapter => 
  adapter.map(item => item.address)
);
console.log(allAddresses);
// 输出示例:["ffff::ffff:ffff:ff:ffff", "10.0.0.1", "::1", "127.0.0.1"]

内容的提问来源于stack exchange,提问作者Dwaine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:15:44