【问题标题】:How can I get the local IP address in Node.js?如何在 Node.js 中获取本地 IP 地址?
【发布时间】:2012-05-31 19:02:33
【问题描述】:

我不是指

127.0.0.1

而是其他计算机用来访问机器的那个,例如

192.168.1.6

【问题讨论】:

标签: node.js


【解决方案1】:

http://nodejs.org/api/os.html#os_os_networkinterfaces

var os = require('os');

var interfaces = os.networkInterfaces();
var addresses = [];
for (var k in interfaces) {
    for (var k2 in interfaces[k]) {
        var address = interfaces[k][k2];
        if (address.family === 'IPv4' && !address.internal) {
            addresses.push(address.address);
        }
    }
}

console.log(addresses);

【讨论】:

  • 对于那些搜索interwebz的人来说,这通常被称为网络IP。
  • 我采用了这种技术并将其封装到一个名为 interface-addresses 的模块中。在这里查看github.com/nisaacson/interface-addresses
  • 只是为了理解,为什么有多个IP地址?当我用 gulp 运行它时,我得到:en0vnic0vnic01en0 是浏览器同步显示给我的一个。
  • 你能帮我解决这个问题吗stackoverflow.com/questions/52241799/…@seppo0010
  • 嘿,您可能想评论一下如何过滤掉有效的非内部 ipv6 地址。不过这个问题的答案很好,谢谢。
【解决方案2】:

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

var ip = require("ip");
console.dir ( ip.address() );

【讨论】:

  • 这是最短的解决方案
  • 事实上,如果你只需要IP,这个解决方案比接受的解决方案长约380行,因为你需要包含node-ip
  • @wacko :那又怎样,它是 testet 并提供了一个简洁的 api。由于它在服务器上运行,库中的 380 位置真的不值得一提。它本身也没有依赖关系,这很好。
  • 这很酷,但不适用于具有专用网络集的 vagrant box。当你真的想要 eth1 地址时,你会得到 eth0 地址。
  • 我不断返回 ip 127.0.0.1 而不是地址?
【解决方案3】:

我的版本需要一个紧凑的单文件脚本,希望对其他人有用:

var ifs = require('os').networkInterfaces();
var result = Object.keys(ifs)
  .map(x => [x, ifs[x].filter(x => x.family === 'IPv4')[0]])
  .filter(x => x[1])
  .map(x => x[1].address);

或者回答原来的问题:

var ifs = require('os').networkInterfaces();
var result = Object.keys(ifs)
  .map(x => ifs[x].filter(x => x.family === 'IPv4' && !x.internal)[0])
  .filter(x => x)[0].address;

【讨论】:

  • 那些 loooooong 1-liners 正在杀死我。宁愿它多行和缩进。性感的解决方案。
【解决方案4】:
$ npm install --save quick-local-ip

紧随其后

var myip = require('quick-local-ip');

//getting ip4 network address of local system
myip.getLocalIP4();

//getting ip6 network address of local system
myip.getLocalIP6();

【讨论】:

    【解决方案5】:

    https://github.com/dominictarr/my-local-ip

    $ npm install -g my-local-ip
    $ my-local-ip
    

    $ npm install --save my-local-ip
    $ node
    > console.log(require('my-local-ip')())
    

    一个非常小的模块可以做到这一点。

    【讨论】:

      【解决方案6】:

      野蛮单线来袭

      根据接受的答案,这将根据地址属性构建一个带有条件条目的对象数组

      [{name: {interface name}, ip: {ip address}}, ...]
      
      const ips = Object.entries(require("os").networkInterfaces()).reduce((acc, iface) => [...acc, ...(iface[1].reduce((acc, address) => acc || (address.family === "IPv4" && !address.internal), false) ? [{name: iface[0], ip: iface[1].filter(address => address.family === "IPv4" && !address.internal).map(address => address.address)[0]}] : [])], []);
      console.log(ips);
      

      解释:

      const ips = Object.entries(require("os").networkInterfaces()) // fetch network interfaces
      .reduce((acc, iface) => [ // reduce to build output object
          ...acc, // accumulator
          ...(
              iface[1].reduce((acc, address) => acc || (address.family === "IPv4" && !address.internal), false) ? // conditional entry
              [ // validate, insert it in output
                  { // create {name, ip} object
                      name: iface[0], // interface name
                      ip: iface[1] // interface IP
                      .filter(address => address.family === "IPv4" && !address.internal) // check is IPv4 && not internal
                      .map(address => address.address)[0] // get IP
                  }
              ] 
              : 
              [] // ignore interface && ip
          )
      ], []);
      

      输出示例:

      Array(4) [Object, Object, Object, Object]
      length:4
      __proto__:Array(0) [, …]
      0:Object {name: "vEthernet (WSL)", ip: "172.31.xxx.x"}
      1:Object {name: "Ethernet", ip: "10.0.x.xx"}
      2:Object {name: "VMware Network Adapter VMnet1", ip: "192.168.xxx.x"}
      3:Object {name: "VMware Network Adapter VMnet8", ip: "192.168.xx.x"}
      

      【讨论】:

        【解决方案7】:

        从 Node 版本 0.9.6 开始,就有一种简单的方法可以根据每个请求获取服务器的 IP 地址。如果您的机器有多个 IP 地址,或者即使您在 localhost 上做某事,这可能很重要。

        req.socket.localAddress 将根据当前连接返回正在运行的机器节点的地址。

        如果您的公共 IP 地址为 1.2.3.4,并且有人从外部访问您的节点服务器,则 req.socket.localAddress 的值将是 "1.2.3.4"

        如果您从 localhost 访问同一服务器,则地址将为 "127.0.0.1"

        如果您的服务器有多个公共地址,那么req.socket.localAddress 的值将是套接字连接的正确地址。

        【讨论】:

          【解决方案8】:

          用一些 es6 和模块语法对Ebrahim's answer 进行了一些修改,以获得更精简的代码:

          import { networkInterfaces } from "os";
          const netInterfaces = networkInterfaces();
          const [{ address }] = Object.values(netInterfaces).flatMap((netInterface) =>
            netInterface.filter((prop) => prop.family === "IPv4" && !prop.internal)
          );
          console.log(address) // -> '192.168...'
          

          【讨论】:

            猜你喜欢
            • 2011-04-08
            • 2016-11-27
            • 2021-08-19
            • 2014-06-26
            • 2021-01-28
            • 2011-10-11
            相关资源
            最近更新 更多