You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js获取客户端IP并查询地理位置?部署后遇IP异常

解决Express获取客户端真实IP及地理位置的问题

问题根源

  1. 你调用http://ipinfo.io/ip获取的是服务器自身的公网IP,并非客户端IP,这是核心错误。
  2. 本地测试时req.ip返回::1是IPv6格式的localhost地址,属于正常现象。
  3. 部署后如果应用在反向代理(如Nginx、云平台自带代理)之后,Express默认不会解析代理传递的客户端IP,需要配置信任代理。
  4. 你代码里用的x-forward-ip头通常不存在,标准的代理传递IP的头是X-Forwarded-For。

修正后的实现代码

var express = require('express');
var app = express();
const IPData = require("ipdata").default;
require('dotenv').config();

const apiKey = process.env.API_KEY;
const ipdata = new IPData(apiKey);

// 配置Express信任代理,确保能正确获取客户端IP(部署在反向代理后必须加)
app.set('trust proxy', true);

app.get('/location', async (req, res) => {
    try {
        // 优先从X-Forwarded-For头获取客户端IP,其次用req.ip
        let clientIp = req.headers['x-forwarded-for']?.split(',')[0] || req.ip;
        
        // 本地测试时过滤掉localhost的IP,避免无效查询
        if (clientIp === '::1' || clientIp === '127.0.0.1') {
            return res.status(400).send('无法在本地环境获取公网IP');
        }

        const data = await ipdata.lookup(clientIp);
        return res.json({
            city: data.city,
            region: data.region,
            country: data.country_name,
            postal: data.postal
        });
    } catch (error) {
        console.log(error);
        res.status(500).send('获取地理位置失败');
    }
});

app.listen(8000, () => {
    console.log('服务器已启动在端口8000');
});

关键说明

  • app.set('trust proxy', true):告诉Express应用运行在反向代理之后,这样req.ip会被正确设置为客户端的真实IP,而不是代理服务器的IP。
  • X-Forwarded-For头:大部分反向代理会把客户端IP放在这个头里,多个代理时该头是逗号分隔的IP列表,取第一个就是最原始的客户端IP。
  • 移除request模块调用:之前的request.get('http://ipinfo.io/ip')完全错误,它请求的是服务器自己的IP,直接删除即可。
  • 本地IP过滤:本地测试时返回的是localhost地址,无法查询到真实地理位置,所以直接提示无法获取。

额外注意事项

  • 如果部署在特定云平台(如Heroku、Vercel),需要确认平台是否传递X-Forwarded-For或其他自定义IP头,部分平台可能用X-Real-IP。
  • 确保ipdata库的API key有效,避免查询失败。

内容的提问来源于stack exchange,提问作者swetha hirge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:45:47