如何在Node中确定用户的IP地址

518

我该如何在控制器中确定给定请求的IP地址?例如(在express中):

app.post('/get/ip/address', function (req, res) {
    // need access to IP address here
})

49
如果你正在使用Express,可以使用req.ip - FrickeFresh
尝试一下这个:https://github.com/indutny/node-ip - Stephen Last
62
对于那些像我一样从localhost工作的人,下面所有答案的结果几乎都会出现::1。这让我困惑了一段时间。后来发现::1是真正的IP地址,是本地主机的IPV6表示法。希望这能帮助到某些人。 - Pramesh Bajracharya
Cloudflare 获取客户端 IP req.headers['cf-connecting-ip'] - Muhammad Shahzad
33个回答

0

首先,在您的项目中安装{{link1:request-ip}}。

import requestIp from 'request-ip';
const clientIp = requestIp.getClientIp(req); 
console.log(clientIp)

如果您在本地主机上工作,则结果可能会显示::1,因为::1是真实的IP地址,也是本地主机的IPV6表示法。


-1

我们可以使用这段代码在Node.js中进行检查

const os       = require('os');
const interfaces = os.networkInterfaces();

let addresses = [];

for (var k in interfaces) {

    for (var k2 in interfaces[k]) {

        const address = interfaces[k][k2];

        if ( (address.family === 'IPv4' || address.family === 'IPv6')  && 
            !address.internal) {

            addresses.push(address.address);

        }
    }
}
console.log(addresses);

1
一个好的答案总是会包括解释为什么这样做可以解决问题,这样原帖作者和任何未来的读者都可以从中学习。 - Tyler2P
1
OP要求客户端发送请求的IP地址,而不是提供路由服务的应用程序的本地IP地址。 - exceptionsAreBad

-10

我也遇到了同样的问题...虽然我是JavaScript新手,但我通过使用req.connection.remoteAddress解决了这个问题;它给了我IP地址(但是以ipv6格式::ffff.192.168.0.101显示),然后使用.slice删除前7位数字。

var ip = req.connection.remoteAddress;

if (ip.length < 15) 
{   
   ip = ip;
}
else
{
   var nyIP = ip.slice(7);
   ip = nyIP;
}

这不是一个好的方法,因为IPv6不仅仅是7个数字+IPv4,而且可能完全不同。 - Radek
@Radek 如果您验证了地址的开头,它符合规范(请参见https://en.wikipedia.org/wiki/IPv6_address ctrl-f搜索“IPv4-mapped”)ip=(ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined))将替换上面代码中的if... - unsynchronized
我个人封装了来自npm request-ip的getClientIp()函数,创建了function getClientIp4(req){ var ip=typeof req==='string'?req:getClientIp(req); return (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined)); }。它接受先前获取的IP或请求对象作为输入,并返回IP或未定义。 - unsynchronized

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