Cloud Functions请求处理失败:第三方API调用遇域名解析错误
解决Firebase Cloud Functions请求第三方API的CORS与域名解析问题
嘿,我来帮你搞定这个问题!首先看日志里的getaddrinfo ENOTFOUND cors-anywhere.herokuapp.com,这说明你用的公共CORS代理服务cors-anywhere.herokuapp.com已经停止服务了——这个公共实例早就因为流量过大被Heroku关停,所以域名根本解析不到,自然连不上。
而且其实你完全不需要第三方CORS代理!因为Firebase Cloud Functions是运行在服务器端的,不存在浏览器的CORS限制,你可以直接请求目标API,然后在自己的函数响应里添加CORS头就行。下面是具体的修复步骤和代码:
核心修复步骤
- 移除失效的第三方CORS代理,直接请求目标API
- 在函数响应中添加CORS允许头,让前端能正常接收数据
- 正确处理API响应(转成JSON/文本再返回)
- 安全存储API密钥(避免硬编码)
修改后的完整代码
const functions = require('firebase-functions'); const fetch = require('node-fetch'); exports.findPlayer = functions.https.onRequest((req, res) => { // 设置CORS头,允许前端跨域请求(建议指定具体域名,*仅用于测试) res.set('Access-Control-Allow-Origin', '*'); // 处理OPTIONS预检请求(复杂跨域请求会触发) if (req.method === 'OPTIONS') { res.set('Access-Control-Allow-Methods', 'GET'); res.set('Access-Control-Allow-Headers', 'Content-Type'); return res.status(204).send(''); } const nickname = req.query.nickname; const region = req.query.region; const mode = req.query.mode; // 从Firebase环境变量获取API密钥(更安全) // 先运行命令设置:firebase functions:config:set pubgtracker.api_key="你的密钥" const apiKey = functions.config().pubgtracker.api_key; const requestOptions = { method: "GET", headers: { 'TRN-Api-Key': apiKey // 注意:PubgTracker要求的API头是TRN-Api-Key,不是my-api-key! } }; // 直接请求目标API,无需第三方代理 fetch(`https://api.pubgtracker.com/v2/profile/pc/${nickname}?region=${region}&mode=${mode}`, requestOptions) .then(response => { if (!response.ok) { throw new Error(`API请求失败:${response.status}`); } return response.json(); // 将响应转成JSON格式返回 }) .then(data => { res.send(data); }) .catch(error => { // 捕获并返回错误信息,方便调试 console.error('请求出错:', error); res.status(500).send(`请求失败:${error.message}`); }); });
额外关键注意点
- API头字段修正:你之前写的
my-api-key是错误的,PubgTracker的API要求的请求头是TRN-Api-Key,这个一定要改对,否则会返回权限错误。 - 错误处理:新增了catch块捕获请求过程中的异常,返回明确的错误信息,方便你排查问题。
- 安全建议:不要把API密钥硬编码在代码里,用Firebase环境变量存储更安全,避免密钥泄露。
这样修改后,你的Cloud Functions应该就能正常获取数据并返回给前端了,再也不会出现域名解析失败的问题。
内容的提问来源于stack exchange,提问作者Falborian
相关产品推荐
相关产品推荐

