如何在 Node.js Express 中获取 IP 地址?

4

我正在使用以下代码在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地址。

这是我所做的更改:

我将'trust proxy'设置为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地址。虽然我不确定,但我认为这就是您获得相同地址的原因。 - Karan Gaur
你的意思是想要获取设备在所在网络上的IP地址吗? - CodeWalker
2
如果您能说明期望获得的IP地址示例或类型/范围,可能会更有帮助。如果您正在尝试获取已通过NAT(例如,我的计算机具有192.168.0.101的地址)的地址,并且您想要从公共互联网托管的网站的XFF标头中返回地址,则您正在要求不可能的事情。同样适用于任何私有范围。请参见https://en.wikipedia.org/wiki/Private_network。 - Richard Wheeldon
你要找的是其他设备的本地局域网IP。 - Cerceis
我同意Richard的观点。你可以在这里找到更多信息 https://dev59.com/8GIj5IYBdhLWcg3wflMy#32841043 - Karan Gaur
显示剩余6条评论
4个回答

2

1
我找到了另一个适用于我的用例的解决方案。根据一些人的评论,似乎不可能找到连接到您的网站的设备的私有IP地址,只能找到公共IP地址。
@Cerceis的os.networkInterfaces()答案可能有效。我进行了快速测试,但无法确定它是否有效。我没有时间对其进行更全面的测试。如果您希望找到答案,可以在Node.js中尝试os.networkInterfaces(),这可能会得到您正在寻找的IP地址。

0

你可以在 Node.js 中使用本地的 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'
    }
  ]
}

-2

在Node.js中查找IP地址

查找IP地址的最简单方法之一是使用“ip” NPM模块。它非常快速和简便(而且在过去也曾为我工作)。

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

了解更多请访问: https://www.npmjs.com/package/ip


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