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

432

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


1
值得思考的是,可以查看 http://joeyh.name/code/moreutils/ 和 https://github.com/polotek/procstreams。我从不离开家门而没有它们。 - Tegra Detra
尝试一下这个:https://github.com/indutny/node-ip - Stephen Last
44个回答

2

使用:

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 地址 - Franco Aguilera
需要解释一下。 - Peter Mortensen

1
这是一个非常简洁的一行代码,可以实现此功能:
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

1

我正在使用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);

这个指令是 hostname -I(大写的 I)。它会返回机器分配的所有 IP 地址列表。你需要的是第一个 IP 地址,即附加到当前启用接口的那个 IP 地址。 - blueren

1
这是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;
}

1
以下是比前面的最佳答案更好的原因:
  • 代码应尽可能自我解释。

  • 应避免使用for...in...枚举数组。

  • 应验证for...in...枚举,以确保被枚举的对象包含您正在查找的属性。由于JavaScript是弱类型的,并且for...in...可以处理任意任意对象;因此,更安全的做法是验证所需属性是否可用。

     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);
    

这句话在“for可用”附近让人难以理解。 - Peter Mortensen

1

我觉得这里有些答案过于复杂了。以下是使用纯Nodejs更好的方法。

import os from "os";

const machine = os.networkInterfaces()["Ethernet"].map(item => item.family==="IPv4")

console.log(machine.address) //gives 192.168.x.x or whatever your local address is

请参阅文档:NodeJS - os模块:networkInterfaces


"不必要的过度复杂化",但你的示例仅支持硬编码的“以太网”接口。那WiFi、"vEtherenet"或任何其他网络接口呢? - tenbits

0

被接受的答案是异步的。我想要一个同步版本:

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 (i.e. 127.0.0.1) and non-IPv4 addresses");
      continue;
    }
    console.log("Found IP address: " + alias.address);
    return alias.address;
  }
}
return false;

被接受的答案是异步的,你为什么这样认为?forEach是同步的。 - Arturo Torres Sánchez

0
这是一个变体,可以让你获取本地IP地址(在Mac和Windows上测试过):

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

0
更大的问题是“为什么?”
如果您需要知道您的Node.js实例正在侦听的服务器,您可以使用req.hostname

3
如果你有一个脚本,只有在运行于“生产”服务器时才应执行特定操作,而不是在服务器被镜像并恢复到新的服务器实例时执行。本地IP地址可能是服务器唯一可以区分原始服务器和副本的方式。 - Molomby
获取IP会有很多要求,例如将集群作为自动伸缩。 - Sreeraj

0

const { networkInterfaces } = require('os')

const nets = networkInterfaces() const address = nets['Wi-Fi'][1].address


2
你的回答可以通过添加更多关于代码功能和如何帮助提问者的信息来改进。 - undefined
1
@SangbokLee 尽管仅有代码的答案不被看好,但它们答案,因此你的评论不合适。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接