在node.js中获取本地IP地址
我有一个简单的node.js程序在我的机器上运行,我想获取运行我的程序的PC的本地IP地址。 我如何得到node.js?
'use strict'; var os = require('os'); var ifaces = os.networkInterfaces(); Object.keys(ifaces).forEach(function (ifname) { var alias = 0; ifaces[ifname].forEach(function (iface) { if ('IPv4' !== iface.family || iface.internal !== false) { // skip over internal (ie 127.0.0.1) and non-ipv4 addresses return; } if (alias >= 1) { // this single interface has multiple ipv4 addresses console.log(ifname + ':' + alias, iface.address); } else { // this interface has only one ipv4 adress console.log(ifname, iface.address); } ++alias; }); }); // en0 192.168.1.101 // eth0 10.0.0.101
os.networkInterfaces现在不适用于Windows。 运行程序来parsing结果似乎有点有点。 这是我使用的。
require('dns').lookup(require('os').hostname(), function (err, add, fam) { console.log('addr: '+add); })
这应该返回您的第一个networking接口本地IP。
https://github.com/indutny/node-ip
var ip = require("ip"); console.dir ( ip.address() );
这里是node.js代码片段,它将parsingifconfig
的输出,并(asynchronous)返回find的第一个IP地址:
(仅在MacOS Snow Leopard上testing;希望它也可以在Linux上运行)
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 OSs without 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 IPs var matches = stdout.match(filterRE); // JS has no lookbehind REs, 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
,则该函数每次都会执行一次系统调用; 否则使用caching的值。
更新版本
返回所有本地networking地址的数组。
在Ubuntu 11.04和Windows XP 32上testing
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);
您可以使用os模块find您的计算机的任何IP地址 – 这是NodeJS 原生的
var os = require( 'os' ); var networkInterfaces = os.networkInterfaces( ); console.log( networkInterfaces );
所有你需要做的就是调用os.networkInterfaces() ,你会得到一个易于pipe理的列表 – 比由联盟运行ifconfig更容易
http://nodejs.org/api/os.html#os_os_networkinterfaces
最好
爱德华多
调用ifconfig是非常依赖于平台的,networking层确实知道一个套接字是在哪个ip地址上,所以最好问一下。 节点不公开这样做的直接方法,但是你可以打开任何套接字,并询问正在使用什么本地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。
然后是networkingIP,你可以从ifconfig
(* nix)或ipconfig
(win)获得。 这只在本地networking中有用。
然后是你的外部/公共IP,如果你能以某种方式向路由器请求路由器,你只能得到这个IP,或者你可以设置一个外部服务,在获得请求的时候返回客户端的IP地址。 现在还有其他类似的服务,比如whatismyip.com。
在某些情况下(例如,如果您有WAN连接),networkingIP和公共IP是相同的,并且都可以在外部使用到达您的计算机。
如果您的networking和公共IP不同,您可能需要让您的networking路由器将所有传入连接转发到您的networkingIP。
2013年更新:
现在有一个新的方法,你可以检查你的连接的套接字对象为一个名为localAddress
的属性,例如net.socket.localAddress
。 它将返回套接字末尾的地址。
最简单的方法就是打开一个随机的端口,并听取它,然后得到您的地址,并closures套接字。
2015年更新:
以前不工作了。
这里是我的获取本地IP地址的实用方法,假设您正在寻找一个IPv4地址,并且机器只有一个真实的networking接口。 它可以很容易地重构为多接口机器返回一个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'; }
下划线和lodash的正确的一行代码是:
var ip = require('underscore') .chain(require('os').networkInterfaces()) .values() .flatten() .find({family: 'IPv4', internal: false}) .value() .address;
安装一个名为ip的模块
npm install ip
然后使用这个代码。
var ip = require("ip"); console.log( ip.address() );
使用npm ip模块
var ip = require('ip'); console.log(ip.address()); > '192.168.0.117'
下面是在香草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'; }
对于Linux和MacOS使用,如果你想以同步的方式获得你的IP,试试这个。
var ips = require('child_process').execSync("ifconfig | grep inet | grep -v inet6 | awk '{gsub(/addr:/,\"\");print $2}'").toString().trim().split("\n"); console.log(ips);
结果会是这样的。
[ '192.168.3.2', '192.168.2.1' ]
对于任何对简洁有兴趣的人来说,下面是一些不需要插件/依赖的“单行程序”,它们不是标准的Node安装的一部分:
eth0的公有IPv4和IPv6作为数组:
var ips = require('os').networkInterfaces().eth0.map(function(interface) { return interface.address; });
eth0的第一个公共IP(通常是IPv4)作为string:
var ip = require('os').networkInterfaces().eth0[0].address;
根据上面的评论,以下是当前版本的Node的工作原理:
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();
上面的答案之一的评论缺less对values()
的调用。 它看起来像os.networkInterfaces()
现在返回一个对象,而不是一个数组。
这是上面例子的一个变种。 它需要注意过滤掉vMware接口等。如果你没有传递一个索引,它会返回所有的地址,否则你可能想把它设置为0,然后只传递null来获取所有的,但是你会把它排除。 如果愿意添加,也可以传递另一个arg作为正则expression式filter
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; }
Google在search“node.js get server 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)
运行服务器程序时,该解决scheme具有非常高的可移植性,准确性和效率。
有关更多详情,请参阅:
如果你进入整个简洁的事情,这里是使用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);
这里是上面的jhurliman的答案的多ip版本:
function getIPAddresses() { var ipAddresses = []; 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) { ipAddresses.push(alias.address); } } } return ipAddresses; }
我意识到这是一个古老的线索,但我想提供一个最佳答案的改进,原因如下:
- 守则应尽可能自我解释。
- 应该避免使用for … in枚举枚举数组。
-
for … in …枚举应该被validation,以确保对象的枚举包含您正在寻找的属性。 因为javscript是松散的types,并且…可以交给任何仲裁对象来处理; validation我们正在寻找的财产是可用的更安全。
var os = require('os'), interfaces = os.networkInterfaces(), address, addresses = [], i, l, interfaceId, interfaceArray; for (interfaceId in interfaces) { if (interfaces.hasOwnProperty(interfaceId)) { interfaceArray = interfaces[interfaceId]; l = interfaceArray.length; for (i = 0; i < l; i += 1) { address = interfaceArray[i]; if (address.family === 'IPv4' && !address.internal) { addresses.push(address.address); } } } } console.log(addresses);
希望这可以帮助
var os = require( 'os' ); var networkInterfaces = os.networkInterfaces( ); var arr = networkInterfaces['Local Area Connection 3'] var ip = arr[1].address;
这是我的变种,允许以便携的方式获得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; };
下面是相同function的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())
输出示例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' } }
类似于其他答案,但更简洁:
'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);
我写了一个Node.js模块 ,通过查看哪个networking接口包含您的默认网关来确定您的本地IP地址。
这比从os.networkInterfaces()
或主机名的DNS查找中select一个接口更可靠。 它可以忽略VMware虚拟接口,环回和VPN接口,并且可以在Windows,Linux,Mac OS和FreeBSD上运行。 在引擎盖下,它执行route.exe
或netstat
并parsing输出。
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 });
一个内存仅用于MAC OS第一个本地主机地址。
在Mac OS上开发应用程序时,要在电话上testing它,并且需要您的应用程序自动select本地主机IP。
require('os').networkInterfaces().en0.find(elm=>elm.family=='IPv4').address
这只是提及如何自动找出IP地址。 要testing这个,你可以去terminal命中
node os.networkInterfaces().en0.find(elm=>elm.family=='IPv4').address
输出将是你的本地主机的IP地址。
我正在使用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);
更大的问题是“为什么?”
如果您需要知道NODE正在侦听的服务器,则可以使用req.hostname
。
接受的答案是asynchronous的,我想要一个同步版本,希望这有助于某人。
var os = require('os'); var ifaces = os.networkInterfaces(); console.log(JSON.stringify(ifaces, null, 4)); for (var iface in ifaces) { var iface = ifaces[iface]; for (var alias in iface) { var alias = iface[alias]; console.log(JSON.stringify(alias, null, 4)); if ('IPv4' !== alias.family || alias.internal !== false) { debug("skip over internal (ie 127.0.0.1) and non-ipv4 addresses"); continue; } console.log("Found ipaddress: " + alias.address); return alias.address; } } return false;
这是一个整齐的小单线你这是这样做的function:
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];
这里有一个变种,可以让你获得本地IP地址(在Mac和Wintesting):
var // Local ip address that we're trying to calculate address // Provides a few basic operating-system related utility functions (built-in) ,os = require('os') // Network interfaces ,ifaces = os.networkInterfaces(); // Iterate over interfaces ... for (var dev in ifaces) { // ... and find the one that matches the criteria var iface = ifaces[dev].filter(function(details) { return details.family === 'IPv4' && details.internal === false; }); if(iface.length > 0) address = iface[0].address; } // Print the result console.log(address); // 10.25.10.147