如何解构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')
解决方法
你的代码存在两个核心问题:
- 多余的JSON序列化/解析:
interfaces()返回的本身就是JavaScript对象,不需要转成JSON字符串再解析,这一步完全没必要。 - 错误的解构赋值逻辑:你试图通过不存在的
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
相关产品推荐
相关产品推荐

