我在我的电脑上运行了一个简单的Node.js程序,我想获取运行该程序的PC的本地IP地址。如何使用Node.js获取它?
我在我的电脑上运行了一个简单的Node.js程序,我想获取运行该程序的PC的本地IP地址。如何使用Node.js获取它?
这些信息可以在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
// 'IPv4' is in Node <= 17, from 18 it's a number 4 or 6
const familyV4Value = typeof net.family === 'string' ? 'IPv4' : 4
if (net.family === familyV4Value && !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"
Object.values(require('os').networkInterfaces()).reduce((r, list) => r.concat(list.reduce((rr, i) => rr.concat(i.family==='IPv4' && !i.internal && i.address || []), [])), [])
- som这是我使用的。
require('dns').lookup(require('os').hostname(), function (err, add, fam) {
console.log('addr: ' + add);
})
这应该返回你的第一个网络接口的本地IP地址。
https://github.com/indutny/node-ip
var ip = require("ip");
console.dir ( ip.address() );
你可以使用 os 模块来查找你的机器的任何IP地址 - 而且它是 Node.js 的 原生 模块:
var os = require('os');
var networkInterfaces = os.networkInterfaces();
console.log(networkInterfaces);
你只需要调用os.networkInterfaces()函数,就可以得到一个易于管理的列表 - 比运行ifconfig更加容易。
var address = networkInterfaces ['venet0:0'] [0] .address
- Anthonyos.networkInterfaces()
返回一个简单的JSON对象,方便使用 ;) - chankruze这是我用于获取本地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 alias in iface if (alias.family == version && !alias.internal) return alias.address return "0.0.0.0"
- Jay安装一个名为ip
的模块,例如:
npm install ip
然后使用这段代码:
var ip = require("ip");
console.log(ip.address());
<socket>.localPort
和<socket.remotePort>
的含义请参考https://nodejs.org/api/net.html#net_class_net_socket。 - nomadDockerNAT
IP。 - Michal Miky Jankovský使用npm ip
模块:
var ip = require('ip');
console.log(ip.address());
> '192.168.0.117'
ifconfig
的输出,并(异步地)返回找到的第一个 IP 地址: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, '$1'));
}
// 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, '$1')
if (!ignoreRE.test(ip)) {
cached.push(ip);
}
}
//}
callback(error, cached);
});
};
})();
getNetworkIPs(function (error, ip) {
console.log(ip);
if (error) {
console.log('error:', error);
}
}, false);
filterRE = /\bIP-?[^:\r\n]+:\s*([^\s]+)/g;
。除此之外,这个脚本非常棒,真的帮了我大忙。非常感谢! - User not found调用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地址始终是127.0.0.1。
然后是网络IP地址,你可以通过ifconfig
(*nix)或者ipconfig
(win)获取,这只在局域网内有用。
接下来是你的外部/公共IP地址,只有当你能够询问路由器获取它,或设置一个外部服务来返回客户端IP地址时才有用。此外还存在其他类似的服务,如whatismyip.com。
在某些情况下(例如,如果你有WAN连接),网络IP地址和公共IP地址是相同的,都可以用于从外部访问你的计算机。
如果你的网络和公共IP地址不同,你可能需要让你的网络路由器将所有传入的连接转发到你的网络IP地址。
更新2013:
现在有一种新的方法。你可以检查连接的socket对象是否有一个叫做localAddress
的属性,例如net.socket.localAddress
。它返回socket的本地地址。
最简单的方法是只需打开一个随机端口并侦听它,然后获取你的地址并关闭该套接字。
更新2015:
以前的方法已经不再适用了。
ifconfig
或ipconfig
并解析响应字符串? - user123444555621ifconfig
的输出几乎是唯一的方法。 - Tor Valamonet.socket
在2015年以后返回了undefined
,所以“新的做法”不再有效。存在一个net.Socket
,但它没有一个localAddress
属性。 - trysis