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

如何在TypeScript版ApolloServer中获取用户IP地址?

获取Apollo Server中用户IP地址的解决方案

问题背景

需要获取客户端IP地址,当前使用Express + Apollo Server的配置如下:

const app = express()
const port = 5100

const server = new ApolloServer({
    typeDefs,
    resolvers,
});

await server.start()
server.applyMiddleware({app})


app.listen(port, () => {
  console.log(`🚀 server started at http://localhost:${port}`)
})

此前尝试相关教程但未成功。


解决步骤

1. 配置Express信任代理(若需)

如果你的服务器部署在反向代理(如Nginx、云平台网关)之后,Express默认会把代理服务器的IP当成客户端IP,需要先开启信任代理:

const app = express()
const port = 5100

// 根据实际代理环境调整参数,比如信任本地回环地址或指定代理IP段
app.set('trust proxy', true)

2. 将IP传入Apollo上下文

修改Apollo Server配置,在context函数中从请求对象提取IP并传递给resolver:

const server = new ApolloServer({
    typeDefs,
    resolvers,
    context: ({ req }) => {
        // 优先用req.ip, fallback到连接对象的远程地址
        const clientIp = req.ip || req.connection.remoteAddress
        return { clientIp }
    },
});

await server.start()
server.applyMiddleware({ app })

app.listen(port, () => {
  console.log(`🚀 server started at http://localhost:${port}`)
})

3. 在Resolver中调用IP

现在可以在任意resolver里通过上下文直接获取客户端IP:

const resolvers = {
  Query: {
    getUserInfo: (parent, args, context) => {
      console.log('当前客户端IP:', context.clientIp)
      // 业务逻辑处理...
      return { ip: context.clientIp }
    }
  }
}

关键注意事项

  • 生产环境务必正确配置trust proxy,避免获取到代理服务器IP而非真实客户端IP;
  • 部分环境下req.ip可能为空,保留req.connection.remoteAddress作为兜底方案;
  • 若使用Apollo订阅(WebSocket),需要额外在WebSocket服务器配置中传递IP,核心逻辑是从握手请求中提取IP并注入订阅上下文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:20:32