我有一个NodeJS / ExpressJS API,该API执行HTTP请求以在发送响应之前获取一些JSON。这是代码片段:
const ipApiUrl = `https://ipapi.co/${ip}/json/`
const ipApiResponse = await axios.get(ipApiUrl)
console.log(ipApiResponse.data)
ipCountryCode = ipApiResponse.data.country_code
此代码在本地可以正常工作。在Heroku上也可以正常工作。但是,它的不能在Google Cloud Run上起作用。
这是
ipApiResponse.data
应该是的:{
"ip": "141.117.117.76",
"city": "Toronto",
"region": "Ontario",
"region_code": "ON",
"country": "CA",
"country_code": "CA",
...
}
但是,从Google Cloud发送请求时,运行我正在使用的API会返回不同的结果。相反,我得到此响应:
{ ip: '169.254.8.129', reserved: true }
我认为这个问题与Google Cloud Run或Docker有关,因为我在向其他网站(例如ipstack.com)发出HTTP请求时也遇到了问题。
我正在使用Docker部署到Google Cloud Run。我的
Dockerfile
使用的是node:10
,并像文档中所述公开PORT
环境变量。除此HTTP请求外,其他所有内容均正常运行。我已经尝试了axios
和fetch
。
最佳答案
要在Cloud Run应用程序上找到访客的IP地址,您需要阅读X-Forwarded-For
header 。
当您仅查看请求或TCP连接上的IP地址时,就会看到将流量发送到应用程序的负载均衡器的内部IP地址。 (169.254.x.x是在RFC 3927中定义的内部IP地址空间,这就是为什么看到"reserved": true
的原因。)
因此,在Express中,尝试执行以下操作:
var ip = req.header('X-Forwarded-For')
关于docker - Heroku和Google Cloud Run上的HTTP请求不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60347646/