通过 NodeJS express 仅获取 IPv4 ip

Posted

技术标签:

【中文标题】通过 NodeJS express 仅获取 IPv4 ip【英文标题】:Get only IPv4 ips via NodeJS express 【发布时间】:2018-11-24 02:37:25 【问题描述】:

我有一个NodeJSexpress 服务在Centos 上运行并监听GET 请求,我需要识别用户的IP。

目前,我正在使用这个脚本

ip = req.headers['x-forwarded-for'] ||
      req.connection.remoteAddress ||
      req.socket.remoteAddress ||
      req.connection.socket.remoteAddress

问题是有时返回的 IP 是 IPv4,有时是 IPv6。有没有办法只获取 IPv4 IP?

【问题讨论】:

如果用户通过 IPv6 连接,则根本不会有 IPv4 地址。您的代码必须能够处理 IPv6 地址。 这是一个非常有用的评论,我使用了@feiiiii的解决方案,但仍然看到一些ipv6形式的用户ip。 【参考方案1】:

更新

根据 Micheal 的评论,如果客户端通过 ipv6 连接,则不会有 ipv4 地址,因此您必须准备好接受 ipv6。

在服务器上监听时指定 ipv4 参见doc

.listen(port, '0.0.0.0');

【讨论】:

文档似乎解释了一种不同的行为:“如果省略主机名,当 IPv6 可用时,服务器将接受任何 IPv6 地址 (::) 上的连接,或者任何 IPv4 地址 (0.0.0.0 ) 否则。省略端口参数,或使用端口值 0,让操作系统分配一个随机端口,可以在发出 'listening' 事件后使用 server.address().port 检索该端口。 在此答案中添加@michael hamptons 评论可能很有用。对我来说,这并不明显。

以上是关于通过 NodeJS express 仅获取 IPv4 ip的主要内容,如果未能解决你的问题,请参考以下文章

nodejs+express+mongoose无法获取数据库数据问题解决

nodejs(express)项目实现微信分享

如何在 NodeJS 中使用 http 模块在同一端口上打开 IPv4 和 IPv6 套接字?

nodejs api仅适用于主机而不适用于其他设备

将React + NodeJS + Express + MySQL应用程序部署到Heroku仅部署服务器而不是React

Nodejs,Express,路线