【问题标题】:How to get the ip address in Node.js Express?如何在 Node.js Express 中获取 IP 地址?
【发布时间】:2021-08-19 01:17:45
【问题描述】:

我正在使用这段代码来获取 Node.js 中的 ip 地址:

const ip = await (req.headers['x-forwarded-for'] || '').split(',').pop().trim() || req.socket.remoteAddress;

对于我家庭 wifi 网络上的所有设备,当我使用手机上的数据访问我的网站时,我会得到这个 IP 地址:::ffff:127.0.0.1

我正在尝试获取访问我网站的每台设备(手机、笔记本电脑)的 IP 地址。但是所有设备都显示相同的 IP 地址。

如何在 Node.js 中获取每个设备的单独设备 ip 地址?

编辑:

我进行了一些更新,但不再获得 ::ffff:127.0.0.1。我现在得到了互联网连接的 IP 地址。所以如果我连接到 wifi,我会得到 wifi 调制解调器的 IP 地址。如果我在使用数据,我会得到数据连接 ip 地址。

但我需要获取设备 IP 地址。我不想要连接 IP 地址。我想要设备的 IP 地址。

以下是我所做的更改:

我将“信任代理”设置为 true:

app.set('trust proxy', true);

我将 etc/nginx/sites-available/mysite 文件更新为如下所示:

location / {
      proxy_set_header  X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:5050;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
  }

我将 etc/nginx/proxy_params 文件更新为如下所示:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

我做错了什么?我该如何解决?从我正在阅读的内容来看,听起来我应该能够使用 req.headers['x-forwarded-for'] 来获取正确的 IP 地址,但是 req.headers['x-forwarded-for'] 返回与 req.headers['x-real-ip'] 相同,只是它在数组中。

【问题讨论】:

  • 在路由的情况下,如果网络被引导通过一个而不是设备,则 IP 地址是路由器的 IP 地址。因此,您为所有设备获得相同的 IP 地址,即路由器本身的 IP 地址。我不确定,但我相信这就是您获得相同地址的原因。
  • 一开始我也是这么想的。但是当我使用手机数据时显示相同的 IP 地址,而不是我的路由器/wifi 互联网。我也刚刚问了一个人,发现它显示了一个不在我的 wifi 上的手机的相同 IP 地址。
  • 你试过req.connection.remoteAddress吗?
  • 看看这是否有帮助:- stackoverflow.com/questions/10849687/…
  • 如果您举例说明您希望获得的 IP 地址 - 或者至少是什么类型或范围,可能会有所帮助。如果您尝试获取一个通过 NAT 的地址(例如,我的机器的地址为 192.168.0.101)并且您希望从公共托管网站的 XFF 标头返回 that互联网,那么你要求的是不可能的。这同样适用于私有范围内的任何内容。见en.wikipedia.org/wiki/Private_network

标签: javascript node.js express nginx


【解决方案1】:

您可能要查找的是局域网 IP 地址:
你可以使用 Node.js 的默认函数 os.networkInterfaces()

您可以在此处找到文档:
https://nodejs.org/api/os.html#os_os_networkinterfaces

你也可以看看这个帖子:
Get local IP address in Node.js

【讨论】:

    【解决方案2】:

    查找IP地址是Node.js

    查找 IP 地址的最简单方法之一是使用“ip”NPM 模块。它超级快速和简单(过去对我有用)

    const ip = require('ip')
    console.log(ip.address())
    

    了解更多信息:https://www.npmjs.com/package/ip

    【讨论】:

      【解决方案3】:

      我为我的用例找到了另一种解决方案。根据某些人的 cmets,似乎无法找到连接到您网站的设备的私有 IP 地址,只能找到公共 IP 地址。

      @Cerceis os.networkInterfaces() 答案可能有效。我做了一个快速测试,但无法确定它是否有效。我没有时间更全面地测试它。如果您希望找到答案,我会尝试 Node.js 中的 os.networkInterfaces() ,这可能会为您提供所需的 IP 地址。

      【讨论】:

        【解决方案4】:

        您可以在 Node.js 中使用 Native os 模块。它提供了所有与操作系统相关的实用方法和属性。

        var os = require('os');
        var allNetworkInterfaces = os.networkInterfaces();
        console.log(allNetworkInterfaces);
        

        os.networkInterfaces() 的调用将返回一个对象,该对象包含已分配网络地址的网络接口。上述代码的输出如下所示:

        {
          lo: [
            {
              address: '127.0.0.1',
              netmask: '255.0.0.0',
              family: 'IPv4',
              mac: '00:00:00:00:00:00',
              internal: true,
              cidr: '127.0.0.1/8'
            },
            {
              address: '::1',
              netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
              family: 'IPv6',
              mac: '00:00:00:00:00:00',
              scopeid: 0,
              internal: true,
              cidr: '::1/128'
            }
          ],
          eth0: [
            {
              address: '192.168.1.108',
              netmask: '255.255.255.0',
              family: 'IPv4',
              mac: '01:02:03:0a:0b:0c',
              internal: false,
              cidr: '192.168.1.108/24'
            },
            {
              address: 'fe80::a00:27ff:fe4e:66a1',
              netmask: 'ffff:ffff:ffff:ffff::',
              family: 'IPv6',
              mac: '01:02:03:0a:0b:0c',
              scopeid: 1,
              internal: false,
              cidr: 'fe80::a00:27ff:fe4e:66a1/64'
            }
          ]
        }
        

        【讨论】:

          猜你喜欢
          • 2016-11-27
          • 2012-05-31
          • 2011-04-08
          • 1970-01-01
          • 1970-01-01
          • 2018-11-17
          • 2019-04-26
          • 2010-12-26
          相关资源
          最近更新 更多