如何在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
相关产品推荐
相关产品推荐

