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

在Node.js的Express框架中如何获取客户端完整IP地址,当前仅返回::1

解决方案

你当前获取到的::1是IPv6协议下的本地回环地址,等价于IPv4的127.0.0.1,属于本地访问服务时的正常结果,并非代码逻辑错误。

不同场景下的IP获取方法如下:

  • 本地测试验证
    本地测试时不要使用localhost访问服务,改用你设备的局域网IP(比如192.168.x.x格式的地址)访问,此时就能正常获取到你的局域网IP地址。
  • 反向代理部署场景配置
    如果你的服务后续部署在Nginx、CDN等反向代理服务后面,需要先开启Express的代理信任配置,在初始化app后添加一行代码:
    app.set('trust proxy', true)
    
    开启后req.ip会自动解析代理传递的真实客户端IP,而非代理服务器的IP。
  • 手动兜底获取方案
    你也可以通过请求头和连接属性手动拼接兜底逻辑,兼容不同部署场景:
    const getClientIp = (req) => {
      // 优先取反向代理传递的真实IP
      const xForwardedFor = req.headers['x-forwarded-for']
      if (xForwardedFor) {
        // X-Forwarded-For格式为: 客户端IP, 代理1IP, 代理2IP... 取第一个即可
        return xForwardedFor.split(',')[0].trim()
      }
      // 兜底取socket连接的远程地址、req.ip
      return req.socket.remoteAddress || req.ip
    }
    

修改后的完整index.js示例:

const express = require('express')
const app = express()
// 开启代理信任,反向代理部署场景必加
app.set('trust proxy', true)

const getClientIp = (req) => {
  const xForwardedFor = req.headers['x-forwarded-for']
  if (xForwardedFor) {
    return xForwardedFor.split(',')[0].trim()
  }
  return req.socket.remoteAddress || req.ip
}

const middleware = (req, _, next) => {
    console.log('客户端IP:', getClientIp(req))
    next()
}

app.get("/*",middleware, (req, res) => {
    res.send("Hello")
})

app.listen(3000,() => console.log("Server started"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:57:04