通过 NodeJS express 仅获取 IPv4 ip
Posted
技术标签:
【中文标题】通过 NodeJS express 仅获取 IPv4 ip【英文标题】:Get only IPv4 ips via NodeJS express 【发布时间】:2018-11-24 02:37:25 【问题描述】:我有一个NodeJS
express
服务在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 中使用 http 模块在同一端口上打开 IPv4 和 IPv6 套接字?
将React + NodeJS + Express + MySQL应用程序部署到Heroku仅部署服务器而不是React