我有一个简单的Node.js程序在我的机器上运行,我想获得我的程序正在运行的PC的本地IP地址。我如何在Node.js中获得它?


当前回答

如果你喜欢简洁的东西,下面是使用Lodash:

Var OS = require(' OS '); Var _ = require('lodash'); var firstLocalIp = _(os.networkInterfaces()).values().flatten().where({family: 'IPv4', internal: false}).pluck('address').first(); console.log('第一个本地IPv4地址是' + firstLocalIp);

其他回答

您的本地IP地址总是127.0.0.1。

然后是网络IP地址,可以从ifconfig (*nix)或ipconfig (win)中获取。这只在本地网络中有用。

然后是你的外部/公共IP地址,你只能通过某种方式向路由器请求它,或者你可以设置一个外部服务,在收到请求时返回客户端IP地址。还有其他类似的服务,比如whatismyip.com。

在某些情况下(例如,如果您有一个广域网连接),网络IP地址和公共IP地址是相同的,并且都可以用于外部访问您的计算机。

如果您的网络和公共IP地址不同,您可能需要让网络路由器将所有传入连接转发到您的网络IP地址。


2013年更新:

现在有了一种新的方法。你可以检查连接的套接字对象的localAddress属性,例如net.socket.localAddress。它返回套接字一端的地址。

最简单的方法是打开一个随机端口并监听它,然后获取您的地址并关闭套接字。


2015年更新:

前面的已经不管用了。

对于任何对简洁感兴趣的人来说,这里有一些“一行程序”,它们不需要不是标准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;

更大的问题是“为什么?”

如果你需要知道Node.js实例监听的服务器,你可以使用req.hostname。

根据注释,以下是当前版本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()现在返回一个对象而不是数组。

这里有一个可能是最干净、最简单的答案,没有依赖关系,而且适用于所有平台。

const { lookup } = require('dns').promises;
const { hostname } = require('os');

async function getMyIPAddress(options) {
  return (await lookup(hostname(), options))
    .address;
}