我指的不是
127.0.0.1
而是其他计算机用来访问该设备的IP地址,例如:
192.168.1.6
我指的不是
127.0.0.1
而是其他计算机用来访问该设备的IP地址,例如:
192.168.1.6
http://nodejs.org/api/os.html#os_os_networkinterfaces
var os = require('os');
var interfaces = os.networkInterfaces();
var addresses = [];
for (var k in interfaces) {
for (var k2 in interfaces[k]) {
var address = interfaces[k][k2];
if (address.family === 'IPv4' && !address.internal) {
addresses.push(address.address);
}
}
}
console.log(addresses);
en0
,vnic0
,vnic01
。en0
是browsersync显示给我的那一个。 - Andi Gigahttps://github.com/indutny/node-ip
var ip = require("ip");
console.dir ( ip.address() );
node-ip
模块。 - wacko我需要一个紧凑且单文件脚本的版本,希望对他人有用:
var ifs = require('os').networkInterfaces();
var result = Object.keys(ifs)
.map(x => [x, ifs[x].filter(x => x.family === 'IPv4')[0]])
.filter(x => x[1])
.map(x => x[1].address);
或者回答原始问题:
var ifs = require('os').networkInterfaces();
var result = Object.keys(ifs)
.map(x => ifs[x].filter(x => x.family === 'IPv4' && !x.internal)[0])
.filter(x => x)[0].address;
.filter(x => x)
会删除我没有看到的未定义条目。我确实进行了测试,但是我没有未定义的条目。之后我在一个REPL服务器上进行了测试,并出现了未定义的条目。谢谢,Ebrahim! - Marcus Parsons$ npm install --save quick-local-ip
随后
var myip = require('quick-local-ip');
//getting ip4 network address of local system
myip.getLocalIP4();
//getting ip6 network address of local system
myip.getLocalIP6();
https://github.com/dominictarr/my-local-ip
$ npm install -g my-local-ip
$ my-local-ip
$ npm install --save my-local-ip
$ node
> console.log(require('my-local-ip')())
野蛮的一行代码即将到来
基于被接受的答案,这个代码将会构建一个对象数组,其中包含根据地址属性条件而有所不同的条目。
[{name: {interface name}, ip: {ip address}}, ...]
const ips = Object.entries(require("os").networkInterfaces()).reduce((acc, iface) => [...acc, ...(iface[1].reduce((acc, address) => acc || (address.family === "IPv4" && !address.internal), false) ? [{name: iface[0], ip: iface[1].filter(address => address.family === "IPv4" && !address.internal).map(address => address.address)[0]}] : [])], []);
console.log(ips);
const ips = Object.entries(require("os").networkInterfaces()) // fetch network interfaces
.reduce((acc, iface) => [ // reduce to build output object
...acc, // accumulator
...(
iface[1].reduce((acc, address) => acc || (address.family === "IPv4" && !address.internal), false) ? // conditional entry
[ // validate, insert it in output
{ // create {name, ip} object
name: iface[0], // interface name
ip: iface[1] // interface IP
.filter(address => address.family === "IPv4" && !address.internal) // check is IPv4 && not internal
.map(address => address.address)[0] // get IP
}
]
:
[] // ignore interface && ip
)
], []);
输出示例:
Array(4) [Object, Object, Object, Object]
length:4
__proto__:Array(0) [, …]
0:Object {name: "vEthernet (WSL)", ip: "172.31.xxx.x"}
1:Object {name: "Ethernet", ip: "10.0.x.xx"}
2:Object {name: "VMware Network Adapter VMnet1", ip: "192.168.xxx.x"}
3:Object {name: "VMware Network Adapter VMnet8", ip: "192.168.xx.x"}
稍作修改 Ebrahim的回答,加入了一些ES6和模块语法,让代码更简洁:
import { networkInterfaces } from "os";
const netInterfaces = networkInterfaces();
const [{ address }] = Object.values(netInterfaces).flatMap((netInterface) =>
netInterface.filter((prop) => prop.family === "IPv4" && !prop.internal)
);
console.log(address) // -> '192.168...'
req.socket.localAddress
将返回基于当前连接的运行节点的机器的地址。1.2.3.4
,并且有人从外部访问您的节点服务器,则req.socket.localAddress
的值将为"1.2.3.4"
。"127.0.0.1"
。req.socket.localAddress
的值将是套接字连接的正确地址。