在 Node.js 中获取本地 IP 地址

IT技术 javascript node.js ip
2021-01-14 13:33:01

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

6个回答

此信息可以在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"
如果我只想检索活动接口的 IP 地址怎么办?
2021-03-15 13:33:01
var _ = require('下划线'); var ip = _.chain(require('os').networkInterfaces()).flatten().filter(function(val){ return (val.family == 'IPv4' && val.internal == false) }) .pluck('address').first().value(); 控制台日志(IP)
2021-03-16 13:33:01
单行无 lodash节点 >= 7.0.0Object.values(require('os').networkInterfaces()).reduce((r, list) => r.concat(list.reduce((rr, i) => rr.concat(i.family==='IPv4' && !i.internal && i.address || []), [])), [])
2021-03-17 13:33:01
“下划线”“lowdash”“一个班轮” - 毛。
2021-03-22 13:33:01
@CarterCole 您需要在展平之前额外调用 .values() 。
2021-04-01 13:33:01

运行程序来解析结果似乎有点不确定。这是我使用的。

require('dns').lookup(require('os').hostname(), function (err, add, fam) {
  console.log('addr: ' + add);
})

这应该返回您的第一个网络接口本地 IP 地址。

如果我得到每个接口的 DNS 地址怎么办
2021-03-19 13:33:01
请注意,这使用操作系统查找,它不一定会进行 DNS 查找,并且应该知道它自己的主要 IP 地址......
2021-03-20 13:33:01
使用 DNS 查找并不总是一个好主意,因为它可能返回错误的信息(即缓存数据)。在我看来,使用“os.networkInterfaces”是一个更好的主意。
2021-03-24 13:33:01
如果您的服务器在某处有 dns 条目,则使用 DNS 有效。然而,在许多应用程序中没有 dns 条目(例如我的笔记本电脑)。os.networkInterfaces() 可能是要走的路。
2021-03-28 13:33:01
@HermannIngjaldsson:这不是一个非常全面的信息批评。你可以再详细一点吗?也许将示例代码放入一个新问题中,提供更多详细信息并询问为什么它不起作用?
2021-04-07 13:33:01

https://github.com/indutny/node-ip

var ip = require("ip");
console.dir ( ip.address() );
@majidarif 我不认为这是不良文档的有效借口
2021-03-16 13:33:01
它不会为您提供所有适配器的 IP 地址。如果您安装了 Docker,它会提供 vEthernet docker 地址而不是您的实际以太网地址
2021-03-17 13:33:01
这个包的文档不清楚……我也可以得到广播地址,还是我必须自己提供?
2021-03-27 13:33:01
这非常有效。获取 IP 地址实际上是单行的。优秀的。
2021-04-01 13:33:01
@Uri 这就是问题的要求
2021-04-06 13:33:01

您可以使用osmodule找到您机器的任何 IP 地址- 这是Node.js本机

var os = require('os');

var networkInterfaces = os.networkInterfaces();

console.log(networkInterfaces);

您需要做的就是调用os.networkInterfaces(),您将获得一个易于管理的列表 - 比通过联盟运行ifconfig更容易

为我工作。 var address = networkInterfaces['venet0:0'][0].address
2021-03-16 13:33:01
奇怪的。在 SunOS 5.11 上,此调用返回一个空对象
2021-03-18 13:33:01
很棒的答案。var ip = networkInterfaces['eth0'][0]['address']
2021-03-23 13:33:01
这是字面上最好的答案。os.networkInterfaces()返回一个简单的 JSON 对象以使用 ;)
2021-03-31 13:33:01
虽然这看起来很棒,因为它很简单,但它的实际效果可能取决于您的网络配置。例如,OS X 的默认配置中没有 eth0,它是 en0。
2021-04-07 13:33:01

安装一个名为ip如下的module

npm install ip

然后使用此代码:

var ip = require("ip");
console.log(ip.address());
@MrMins,<socket>.localPort以及<socket.remotePorttcp 连接。nodejs.org/api/net.html#net_class_net_socket
2021-03-19 13:33:01
如何显示正在使用的端口?
2021-03-20 13:33:01
它返回私有IP地址而不是公共IP地址。
2021-03-26 13:33:01
它返回DockerNATIP
2021-03-28 13:33:01
这将返回 127.0.0.1
2021-03-30 13:33:01