#1 楼
可以在os.networkInterfaces()
中找到此信息,'use strict';
const { networkInterfaces } = require('os');
const nets = networkInterfaces();
const results = Object.create(null); // Or just '{}', an empty object
for (const name of Object.keys(nets)) {
for (const net of nets[name]) {
// Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses
if (net.family === 'IPv4' && !net.internal) {
if (!results[name]) {
results[name] = [];
}
results[name].push(net.address);
}
}
}
是一个对象,该对象将网络接口名称映射到其属性(以便一个接口可以具有多个地址): // 'results'
{
"en0": [
"192.168.1.101"
],
"eth0": [
"10.0.0.101"
],
"<network name>": [
"<ip>",
"<ip alias>",
"<ip alias>",
...
]
}
// results["en0"][0]
"192.168.1.101"
q4312079q pre >评论
var _ = require('underscore'); var ip = _.chain(require('os')。networkInterfaces())。flatten()。filter(function(val){return(val.family =='IPv4'&& val.internal == false)}) .pluck('address')。first()。value(); console.log(ip)
–卡特·科尔(Carter Cole)
2013年9月9日15:27
@CarterCole您需要在展平之前额外调用.values()。
–圭多
2015年3月4日在9:41
如果我只想检索活动接口的IP地址怎么办?
– Tejas
15年8月2日在6:54
节点> = 7.0.0的不带破折号的单线:Object.values(require('os')。networkInterfaces())。reduce((r,list)=> r.concat(list.reduce((rr,i )=> rr.concat(i.family ==='IPv4'&&!i.internal && i.address || []),[])),[])
–som
19年1月17日,0:15
“下划线”,“ lowdash”,“一个班轮”-总计。
– B T
20年6月12日在15:43
#2 楼
运行程序以解析结果似乎有些困难。这是我使用的方法。 require('dns').lookup(require('os').hostname(), function (err, add, fam) {
console.log('addr: ' + add);
})
这应该返回您的第一个网络接口本地IP地址。
评论
@HermannIngjaldsson:这不是非常详尽的批评。你可以再详细一点吗?也许以示例代码为例,将其放入一个提供更多详细信息的新问题中,并询问为什么它不起作用?
–十六进制
2012年11月7日在20:11
使用DNS查找并非总是一个好主意,因为它可能返回错误的信息(即缓存的数据)。我认为使用“ os.networkInterfaces”是一个更好的主意。
–圭多
13年2月28日在19:55
如果您的服务器在某处有dns条目,则可以使用DNS。但是,在许多应用程序中都没有dns条目(例如我的笔记本电脑)。 os.networkInterfaces()可能是可行的方法。
– Jeff Whiting
2015年2月6日在20:54
请注意,这使用OS查找,它不一定进行DNS查找,并且应该知道其自己的主要IP地址...
– w00t
2015年9月3日于10:09
如果我得到每个接口的DNS地址怎么办
–taha027
16年1月25日在9:58
#3 楼
https://github.com/indutny/node-ipvar ip = require("ip");
console.dir ( ip.address() );
评论
@Uri这是问题的要求
–Seb
16年11月2日,16:06
该软件包的文档尚不清楚...我还可以获取广播地址,还是必须自己提供?
–迈克尔
17年1月29日在21:33
@majidarif我不认为这是不良文档的有效借口
–迈克尔
17年2月15日在15:11
这非常好用。实际上,获取IP地址是一种选择。优秀的。
– EvSunWoodard
17年7月25日在20:41
它不会为您提供所有适配器的IP地址。如果您安装了Docker,它将提供vEthernet泊坞地址而不是您的实际以太网地址
– TetraDev
17年12月19日在21:52
#4 楼
您可以使用os模块找到您机器的任何IP地址-这是Node.js的本机:var os = require('os');
var networkInterfaces = os.networkInterfaces();
console.log(networkInterfaces);
您需要做的就是调用os.networkInterfaces(),您将获得一个易于管理的列表-比按联盟运行ifconfig更容易。
评论
很棒的答案。 var ip = networkInterfaces ['eth0'] [0] ['address']
–纳图斯·德鲁(Natus Drew)
2014年12月11日上午8:13
尽管这看起来很不错,因为它很简单,但实际效果可能取决于您的网络配置。例如,OS X的默认配置中没有eth0,它是en0。
–鸣叫
2015年1月2日,19:49
为我工作。 var address = networkInterfaces ['venet0:0'] [0] .address
–安东尼
2015年10月2日在20:24
奇怪的。在SunOS 5.11上,此调用返回一个空对象
–迈克尔
17年1月29日在21:34
这实际上是最好的答案。 os.networkInterfaces()返回一个简单的JSON对象以使用;)
– chankruze
20-09-16在15:52
#5 楼
这是我获取本地IP地址的实用方法,假设您要查找的是IPv4地址,并且计算机只有一个真实的网络接口。可以很容易地对其进行重构,以返回多接口机器的IP地址数组。function getIPAddress() {
var interfaces = require('os').networkInterfaces();
for (var devName in interfaces) {
var iface = interfaces[devName];
for (var i = 0; i < iface.length; i++) {
var alias = iface[i];
if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal)
return alias.address;
}
}
return '0.0.0.0';
}
评论
咖啡版本:getLocalIP =(interfaceName =“ en0”,version =“ IPv4”)-> iface = require('os')。networkInterfaces()[interfaceName] for iface中的别名if(alias.family ==版本&&!alias (内部)返回别名。地址返回“ 0.0.0.0”
–杰伊
2015年3月24日20:58
#6 楼
安装一个名为ip
的模块,例如:npm install ip
,然后使用此代码:
var ip = require("ip");
console.log(ip.address());
评论
这将返回127.0.0.1
– WeSam Abdallah
17年11月24日在1:33
它返回私有IP地址而不是公共IP地址。
– Mehmet Kurtipek
19 Feb 25 '19:38
如何显示正在使用的端口?
– MrMins
20 Sep 5 '19:27
@MrMins,
–游牧
20/09/9在15:28
它返回DockerNAT IP
– Michal MikyJankovský
20-09-25在11:29
#7 楼
以下是Node.js代码片段,它将解析ifconfig
的输出并(异步)返回找到的第一个IP地址:(仅在Mac OS X v10.6(Snow Leopard)上进行了测试;我希望
var getNetworkIP = (function () {
var ignoreRE = /^(127\.0\.0\.1|::1|fe80(:1)?::1(%.*)?)$/i;
var exec = require('child_process').exec;
var cached;
var command;
var filterRE;
switch (process.platform) {
// TODO: implement for OSes without the ifconfig command
case 'darwin':
command = 'ifconfig';
filterRE = /\binet\s+([^\s]+)/g;
// filterRE = /\binet6\s+([^\s]+)/g; // IPv6
break;
default:
command = 'ifconfig';
filterRE = /\binet\b[^:]+:\s*([^\s]+)/g;
// filterRE = /\binet6[^:]+:\s*([^\s]+)/g; // IPv6
break;
}
return function (callback, bypassCache) {
// Get cached value
if (cached && !bypassCache) {
callback(null, cached);
return;
}
// System call
exec(command, function (error, stdout, sterr) {
var ips = [];
// Extract IP addresses
var matches = stdout.match(filterRE);
// JavaScript doesn't have any lookbehind regular expressions, so we need a trick
for (var i = 0; i < matches.length; i++) {
ips.push(matches[i].replace(filterRE, ''));
}
// Filter BS
for (var i = 0, l = ips.length; i < l; i++) {
if (!ignoreRE.test(ips[i])) {
//if (!error) {
cached = ips[i];
//}
callback(error, ips[i]);
return;
}
}
// Nothing found
callback(error, null);
});
};
})();
用法示例:
getNetworkIP(function (error, ip) {
console.log(ip);
if (error) {
console.log('error:', error);
}
}, false);
如果第二个参数是
true
,则函数每次都会执行系统调用; 更新版本
返回所有本地网络地址的数组。
在Ubuntu 11.04(Natty Narwhal)和Windows XP 32上进行了测试。
var getNetworkIPs = (function () {
var ignoreRE = /^(127\.0\.0\.1|::1|fe80(:1)?::1(%.*)?)$/i;
var exec = require('child_process').exec;
var cached;
var command;
var filterRE;
switch (process.platform) {
case 'win32':
//case 'win64': // TODO: test
command = 'ipconfig';
filterRE = /\bIPv[46][^:\r\n]+:\s*([^\s]+)/g;
break;
case 'darwin':
command = 'ifconfig';
filterRE = /\binet\s+([^\s]+)/g;
// filterRE = /\binet6\s+([^\s]+)/g; // IPv6
break;
default:
command = 'ifconfig';
filterRE = /\binet\b[^:]+:\s*([^\s]+)/g;
// filterRE = /\binet6[^:]+:\s*([^\s]+)/g; // IPv6
break;
}
return function (callback, bypassCache) {
if (cached && !bypassCache) {
callback(null, cached);
return;
}
// System call
exec(command, function (error, stdout, sterr) {
cached = [];
var ip;
var matches = stdout.match(filterRE) || [];
//if (!error) {
for (var i = 0; i < matches.length; i++) {
ip = matches[i].replace(filterRE, '')
if (!ignoreRE.test(ip)) {
cached.push(ip);
}
}
//}
callback(error, cached);
});
};
})();
更新版本的用法示例
getNetworkIPs(function (error, ip) {
console.log(ip);
if (error) {
console.log('error:', error);
}
}, false);
评论
刚刚在OSX Lion上进行了测试,完美。非常感谢!
– T3db0t
2012年5月3日在21:49
我必须在Windows正则表达式中的“ IP”一词之后删除连字符,因为我的输出没有连字符(我使用的是32位Windows XP)。我不知道这是不是拼写错误,或者您的Windows版本是否真的在“ IP”之后输出连字符,但为了安全起见,我想可以将其设置为可选:filterRE = / \ bIP-?[^ :\ r \ n] +:\ s *([^ \ s] +)/ g;。除此之外,出色的脚本是真正的救星。非常感谢!
–找不到用户
2012年7月6日在18:14
@jSepia:这可能是本地化的事情。德语Windows打印“ IP地址”;)
–user123444555621
2012年7月6日在18:19
足够公平,但是现在您又把它弄坏了:p我的ipconfig输出不包含“ v4”或“ v6”,这似乎是Vista / 7的东西(请参阅technet.microsoft.com/zh-cn/library/bb726952 .aspx)
–找不到用户
2012年7月6日23:40
没有理由进行这种黑客攻击。我们现在有了os.networkInterfaces()。
–布拉德
13年5月18日在2:56
#8 楼
调用ifconfig非常依赖于平台,并且网络层确实知道套接字在哪个IP地址上,所以最好问一下。Node.js并不公开这样做的直接方法,但是您可以打开任何套接字,并询问正在使用的本地IP地址。例如,打开www.google.com的插座:
var net = require('net');
function getNetworkIP(callback) {
var socket = net.createConnection(80, 'www.google.com');
socket.on('connect', function() {
callback(undefined, socket.address().address);
socket.end();
});
socket.on('error', function(e) {
callback(e, 'error');
});
}
使用案例:
getNetworkIP(function (error, ip) {
console.log(ip);
if (error) {
console.log('error:', error);
}
});
评论
如果您想知道-这不一定获得世界范围内看到的公共IP地址。
– artur
2011年9月21日在16:05
如果它不依赖于互联网连接及其速度,那将是一个不错的解决方案。
–雅各布·拉斯克(Jacob Rask)
2011年11月1日于10:21
在我的实例中,此解决方案是完美的,因为我需要知道发出特定请求的接口的IP。
–radicand
13-10-18在5:05
#9 楼
您的本地IP地址始终为127.0.0.1。然后是网络IP地址,您可以从
ifconfig
(* nix)或ipconfig
(win)中获得。这仅在局域网内有用。然后有您的外部/公共IP地址,只有在您可以以某种方式向路由器询问该IP地址或可以设置返回客户端IP的外部服务时,您才能获取该地址。收到请求时的地址。还存在其他此类服务,例如whatismyip.com。
在某些情况下(例如,如果您具有WAN连接),网络IP地址和公用IP是相同的,并且都可以在外部使用
如果您的网络和公共IP地址不同,则可能需要让网络路由器将所有传入的连接转发到您的网络IP地址。
更新2013年:
现在有一种新的方法。您可以在连接的套接字对象中检查名为
localAddress
的属性,例如net.socket.localAddress
。它返回套接字末端的地址。最简单的方法是打开一个随机端口并监听它,然后获取您的地址并关闭套接字。
Update 2015 :
以前的版本不再起作用。
评论
这是否意味着要在nodejs中获取网络地址,您需要对ifconfig或ipconfig进行系统调用并解析响应字符串?
–user123444555621
2010-09-18在8:38
@ Pumbaa80-差不多,除非您的网卡有一些可以调用的驱动程序。同样,如果您有多个网卡(或适配器,例如hamachi),则无法调用各种功能并获得一个IP(即IP)。因此,解析它并解释ifconfig的输出几乎是唯一的方法。
– Tor Valamo
2010-09-18 17:25
截至2015年,net.socket的返回值似乎不确定,因此“执行此操作的新方法”不再起作用。有一个net.Socket,但是它没有localAddress属性。
–trysis
2015年4月9日在16:40
#10 楼
使用npmip
模块:var ip = require('ip');
console.log(ip.address());
> '192.168.0.117'
评论
我不知道,如何告诉现在登陆此页面的用户,这是当前上下文中唯一合适的选项。
–加甘
19年11月17日下午5:39
谢谢@Gagan您的赞赏。
– KARTHIKEYAN.A
19年11月17日在14:29
#11 楼
对于Underscore.js和Lodash而言,正确的单行代码是:var ip = require('underscore')
.chain(require('os').networkInterfaces())
.values()
.flatten()
.find({family: 'IPv4', internal: false})
.value()
.address;
评论
您也可以使用.find({family:'IPv4',internal:false})来获得更短,更优雅的代码
– dcohenb
16 Mar 27 '16 at 11:16
#12 楼
这可能是最干净,最简单的答案,没有依赖项,并且可以在所有平台上使用。 const { lookup } = require('dns').promises;
const { hostname } = require('os');
async function getMyIPAddress(options) {
return (await lookup(hostname(), options))
.address;
}
#13 楼
我所知道的是我想要以192.168.
开头的IP地址。此代码将为您提供:function getLocalIp() {
const os = require('os');
for(let addresses of Object.values(os.networkInterfaces())) {
for(let add of addresses) {
if(add.address.startsWith('192.168.')) {
return add.address;
}
}
}
}
当然,如果您要查找其他号码,则只需更改数字即可。
评论
如果地址不是以192.168开头怎么办?
–anu
19年8月7日,下午3:31
@anu可以将前缀更改为您要查找的前缀,或者使用人们在此处发布的许多其他解决方案之一:-)我的本地IP始终以192.168。开头这就是为什么我选择了它。
– mpen
19年8月7日在17:52
#14 楼
我编写了一个Node.js模块,该模块通过查看哪个网络接口包含默认网关来确定您的本地IP地址。比从
os.networkInterfaces()
或从主机名的DNS查找中选择接口更可靠。它能够忽略VMware虚拟接口,环回和VPN接口,并且可以在Windows,Linux,Mac OS和FreeBSD上运行。在后台,它执行route.exe
或netstat
并解析输出。var localIpV4Address = require("local-ipv4-address");
localIpV4Address().then(function(ipAddress){
console.log("My IP address is " + ipAddress);
// My IP address is 10.4.4.137
});
评论
遗憾的是,当语言未设置为英语时,它在Windows上不起作用:(
–哈维尔G.
17年4月14日在13:22
感谢您报告此错误@JavierG!我已经发布了0.0.2版本,应该可以修复它。
– Ben Hutchison
17年4月22日在9:31
#15 楼
这是使用原始JavaScript的简化版本,用于获取单个IP地址:function getServerIp() {
var os = require('os');
var ifaces = os.networkInterfaces();
var values = Object.keys(ifaces).map(function(name) {
return ifaces[name];
});
values = [].concat.apply([], values).filter(function(val){
return val.family == 'IPv4' && val.internal == false;
});
return values.length ? values[0].address : '0.0.0.0';
}
#16 楼
对于Linux和macOS使用,如果要通过同步方式获取IP地址,请尝试以下操作:var ips = require('child_process').execSync("ifconfig | grep inet | grep -v inet6 | awk '{gsub(/addr:/,\"\");print }'").toString().trim().split("\n");
console.log(ips);
结果将是这样的:
['192.168.3.2', '192.168.2.1']
#17 楼
对于对简洁感兴趣的人,这里有一些“单行”,它们不需要标准Node.js安装中不包含的插件/依赖项:eth0的公共IPv4和IPv6地址作为数组:
var ips = require('os').networkInterfaces().eth0.map(function(interface) {
return interface.address;
});
eth0的第一个公共IP地址(通常是IPv4)作为字符串:
var ip = require('os').networkInterfaces().eth0[0].address;
评论
请记住,这些一线是特定于平台的。在OS X上,我有用于以太网和wifi的en0和en1。在Windows上,我具有“局域网连接”和“无线网络连接”。
–xverges
13年7月29日在10:39
如果您想了解公共远程IP(在OS X上),请使用:var ip = require('os')。networkInterfaces()。en0 [1] .address;
– Marcelo dos Santos
16-4-26的13:47
#18 楼
我仅使用Node.js即可做到这一点。作为Node.js:
var os = require( 'os' );
var networkInterfaces = Object.values(os.networkInterfaces())
.reduce((r,a) => {
r = r.concat(a)
return r;
}, [])
.filter(({family, address}) => {
return family.toLowerCase().indexOf('v4') >= 0 &&
address !== '127.0.0.1'
})
.map(({address}) => address);
var ipAddresses = networkInterfaces.join(', ')
console.log(ipAddresses);
作为Bash脚本(需要安装Node.js)
function ifconfig2 ()
{
node -e """
var os = require( 'os' );
var networkInterfaces = Object.values(os.networkInterfaces())
.reduce((r,a)=>{
r = r.concat(a)
return r;
}, [])
.filter(({family, address}) => {
return family.toLowerCase().indexOf('v4') >= 0 &&
address !== '127.0.0.1'
})
.map(({address}) => address);
var ipAddresses = networkInterfaces.join(', ')
console.log(ipAddresses);
"""
}
#19 楼
以下解决方案适用于我const ip = Object.values(require("os").networkInterfaces())
.flat()
.filter((item) => !item.internal && item.family === "IPv4")
.find(Boolean).address;
评论
非常好。如果没有找到,请稍作调整:const ip = Object.values(require(“ os”)。networkInterfaces())。flat()。reduce((ip,{family,address,internal})=> ip ||!内部&&家庭==='IPv4'&&地址,'');
–x0a
20-11-08在19:03
#20 楼
Google在搜索“ Node.js获取服务器IP”时将我引向了这个问题,因此,对于那些试图在其Node.js服务器程序中尝试实现此目标的用户,我们可以为其提供替代答案(可能是原始发布者的情况)。在最简单的情况下,服务器仅绑定到一个IP地址,因此无需确定IP地址,因为我们已经知道将其绑定到哪个地址(例如,第二个参数传递给了
listen()
函数)。在服务器绑定到多个IP地址的情况下,我们可能需要确定客户端连接的接口的IP地址。就像Tor Valamo所建议的那样,如今,我们可以轻松地从连接的套接字及其
localAddress
属性中获取此信息。例如,如果程序是Web服务器:var http = require("http")
http.createServer(function (req, res) {
console.log(req.socket.localAddress)
res.end(req.socket.localAddress)
}).listen(8000)
如果它是通用TCP服务器:
var net = require("net")
net.createServer(function (socket) {
console.log(socket.localAddress)
socket.end(socket.localAddress)
}).listen(8000)
运行服务器程序时,此解决方案可提供非常高的可移植性,准确性和效率。
有关更多详细信息,请参见:
http://nodejs.org/api/net.html
http://nodejs.org/api/http.html
#21 楼
根据评论,以下是当前版本的Node.js的工作原理:var os = require('os');
var _ = require('lodash');
var ip = _.chain(os.networkInterfaces())
.values()
.flatten()
.filter(function(val) {
return (val.family == 'IPv4' && val.internal == false)
})
.pluck('address')
.first()
.value();
对上述答案之一的评论缺少对
values()
的调用。看起来os.networkInterfaces()
现在返回一个对象而不是数组。评论
我<3 lodash。特别是lodash高尔夫! _.chain(..)可以重写为_(...),. filter(..)可以重写为.where({family:'IPv4',internal:false}),并且您可以删除最终的value(),因为链接时.first()会为您完成。
–瑞安·格雷厄姆(Ryan Graham)
15年6月17日在22:38
#22 楼
这是先前示例的变体。过滤掉VMware接口等时要格外小心。如果不传递索引,它将返回所有地址。否则,您可能希望将其默认设置为0,然后仅传递null即可获取所有内容,但您将对其进行整理。如果愿意,还可以为正则表达式过滤器传递另一个参数。function getAddress(idx) {
var addresses = [],
interfaces = os.networkInterfaces(),
name, ifaces, iface;
for (name in interfaces) {
if(interfaces.hasOwnProperty(name)){
ifaces = interfaces[name];
if(!/(loopback|vmware|internal)/gi.test(name)){
for (var i = 0; i < ifaces.length; i++) {
iface = ifaces[i];
if (iface.family === 'IPv4' && !iface.internal && iface.address !== '127.0.0.1') {
addresses.push(iface.address);
}
}
}
}
}
// If an index is passed only return it.
if(idx >= 0)
return addresses[idx];
return addresses;
}
#23 楼
在macOS上开发应用程序时,您要在电话上对其进行测试,并且需要您的应用程序自动选择localhost IP地址。
require('os').networkInterfaces().en0.find(elm => elm.family=='IPv4').address
这只是提及如何自动查找ip地址。
要进行测试,可以转到终端命中
node
os.networkInterfaces().en0.find(elm => elm.family=='IPv4').address
输出将是您的本地主机IP地址。
#24 楼
这是我的变体,允许以可移植的方式同时获取IPv4和IPv6地址: /**
* Collects information about the local IPv4/IPv6 addresses of
* every network interface on the local computer.
* Returns an object with the network interface name as the first-level key and
* "IPv4" or "IPv6" as the second-level key.
* For example you can use getLocalIPs().eth0.IPv6 to get the IPv6 address
* (as string) of eth0
*/
getLocalIPs = function () {
var addrInfo, ifaceDetails, _len;
var localIPInfo = {};
//Get the network interfaces
var networkInterfaces = require('os').networkInterfaces();
//Iterate over the network interfaces
for (var ifaceName in networkInterfaces) {
ifaceDetails = networkInterfaces[ifaceName];
//Iterate over all interface details
for (var _i = 0, _len = ifaceDetails.length; _i < _len; _i++) {
addrInfo = ifaceDetails[_i];
if (addrInfo.family === 'IPv4') {
//Extract the IPv4 address
if (!localIPInfo[ifaceName]) {
localIPInfo[ifaceName] = {};
}
localIPInfo[ifaceName].IPv4 = addrInfo.address;
} else if (addrInfo.family === 'IPv6') {
//Extract the IPv6 address
if (!localIPInfo[ifaceName]) {
localIPInfo[ifaceName] = {};
}
localIPInfo[ifaceName].IPv6 = addrInfo.address;
}
}
}
return localIPInfo;
};
以下是相同功能的CoffeeScript版本:
getLocalIPs = () =>
###
Collects information about the local IPv4/IPv6 addresses of
every network interface on the local computer.
Returns an object with the network interface name as the first-level key and
"IPv4" or "IPv6" as the second-level key.
For example you can use getLocalIPs().eth0.IPv6 to get the IPv6 address
(as string) of eth0
###
networkInterfaces = require('os').networkInterfaces();
localIPInfo = {}
for ifaceName, ifaceDetails of networkInterfaces
for addrInfo in ifaceDetails
if addrInfo.family=='IPv4'
if !localIPInfo[ifaceName]
localIPInfo[ifaceName] = {}
localIPInfo[ifaceName].IPv4 = addrInfo.address
else if addrInfo.family=='IPv6'
if !localIPInfo[ifaceName]
localIPInfo[ifaceName] = {}
localIPInfo[ifaceName].IPv6 = addrInfo.address
return localIPInfo
console.log(getLocalIPs())
的示例输出{ lo: { IPv4: '127.0.0.1', IPv6: '::1' },
wlan0: { IPv4: '192.168.178.21', IPv6: 'fe80::aa1a:2eee:feba:1c39' },
tap0: { IPv4: '10.1.1.7', IPv6: 'fe80::ddf1:a9a1:1242:bc9b' } }
#25 楼
与其他答案类似,但更为简洁:'use strict';
const interfaces = require('os').networkInterfaces();
const addresses = Object.keys(interfaces)
.reduce((results, name) => results.concat(interfaces[name]), [])
.filter((iface) => iface.family === 'IPv4' && !iface.internal)
.map((iface) => iface.address);
评论
只是想提一下,您可以将Object.keys(interfaces).reduce(...)替换为Object.values(interfaces).flat(),这是同一回事。
–kimbaudi
19年7月13日在22:55
#26 楼
这是一个功能齐全的小衬板,可以正常工作:const ni = require('os').networkInterfaces();
Object
.keys(ni)
.map(interf =>
ni[interf].map(o => !o.internal && o.family === 'IPv4' && o.address))
.reduce((a, b) => a.concat(b))
.filter(o => o)
[0];
评论
为了使您的代码更简洁,您可以消除对reduce的调用,并将对map的调用替换为对flatMap的调用。
–kimbaudi
19年7月13日在22:44
#27 楼
很多时候,我发现有多个面向内部和面向外部的接口(例如:10.0.75.1
,172.100.0.1
,192.168.2.3
),而这正是我真正追求的外部接口(172.100.0.1
)。也有类似的问题,这里还有一个建议,希望可能会对您有所帮助...
const address = Object.keys(os.networkInterfaces())
// flatten interfaces to an array
.reduce((a, key) => [
...a,
...os.networkInterfaces()[key]
], [])
// non-internal ipv4 addresses only
.filter(iface => iface.family === 'IPv4' && !iface.internal)
// project ipv4 address as a 32-bit number (n)
.map(iface => ({...iface, n: (d => ((((((+d[0])*256)+(+d[1]))*256)+(+d[2]))*256)+(+d[3]))(iface.address.split('.'))}))
// set a hi-bit on (n) for reserved addresses so they will sort to the bottom
.map(iface => iface.address.startsWith('10.') || iface.address.startsWith('192.') ? {...iface, n: Math.pow(2,32) + iface.n} : iface)
// sort ascending on (n)
.sort((a, b) => a.n - b.n)
[0]||{}.address;
#28 楼
用途:var os = require('os');
var networkInterfaces = os.networkInterfaces();
var arr = networkInterfaces['Local Area Connection 3']
var ip = arr[1].address;
评论
npm install ip //安装模块var ip = require('ip'); //需要模块ip.address()//我的IP地址
– Flaalf
15年5月11日在17:46
一个解释将是有条理的。
– Peter Mortensen
20/12/21在19:12
#29 楼
如果您热衷于简洁,这里使用Lodash: var os = require('os');
var _ = require('lodash');
var firstLocalIp = _(os.networkInterfaces()).values().flatten().where({ family: 'IPv4', internal: false }).pluck('address').first();
console.log('First local IPv4 address is ' + firstLocalIp);
#30 楼
我正在使用Node.js 0.6.5:$ node -v
v0.6.5
这是我的工作:
var util = require('util');
var exec = require('child_process').exec;
function puts(error, stdout, stderr) {
util.puts(stdout);
}
exec("hostname -i", puts);
评论
这适用于主机名-I(大写i)。它返回机器所有分配的IP地址的列表。您需要的是第一个IP地址。该IP是连接到当前接口的IP。
– blueren
'18 Sep 6'在6:26
评论
思考的食物,请查看joeyh.name/code/moreutils和github.com/polotek/procstreams。我永远不会带着他们离开家。试试这个:github.com/indutny/node-ip