Node.js环境下Firebase Pub/Sub函数HTTP请求提取数据异常求助
Firebase Pub/Sub定时函数拉取CoinMarketCap接口异常排查方案
核心问题排查步骤
- 认证头配置错误:CoinMarketCap官方要求的接口认证头为
X-CMC_PRO_API_KEY,你当前代码使用的Authorization头不符合规范,会直接触发接口权限报错,返回非业务数据。 - 请求参数逻辑失效:你封装的
requestPromise函数入参path未被实际使用,内部路径是硬编码值,外部传入的路径参数完全不生效。 - 请求路径语法错误:调用
requestPromise时传入的路径https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?start=query=limit=存在明显的参数拼接错误,缺少参数值、缺少参数分隔符&,会被接口判定为非法请求。 - 异步逻辑未执行:
onRun回调中定义的匿名async函数没有添加()触发执行,内部请求逻辑实际从未运行。 - 缺少JSON序列化步骤:
http模块接收的响应默认是字符串格式,未经过JSON.parse转换就直接输出,自然和预期的JSON对象格式不符。 - 缺少响应状态校验:当前代码没有判断接口返回的HTTP状态码,哪怕接口返回4xx、5xx错误,也会直接把错误信息返回,导致拿到的是报错内容而非业务数据。
修正后代码
封装的请求函数
import * as http from "http"; async function requestPromise(path: string) { return new Promise((resolve, reject) => { const options = { hostname: "pro-api.coinmarketcap.com", path: path, // 动态使用传入的路径参数 method:"GET", headers: { "X-CMC_PRO_API_KEY": "你的实际API密钥", // 替换为正确的认证头 }, }; http.get(options, (resp) => { let data = ""; // 先校验响应状态码 if (resp.statusCode < 200 || resp.statusCode >= 300) { reject(new Error(`接口请求失败,状态码:${resp.statusCode}`)); resp.resume(); return; } resp.on("data", (chunk) => { data += chunk; }); resp.on("end", () => { try { // 字符串转JSON对象 const jsonResult = JSON.parse(data); resolve(jsonResult); } catch (parseErr) { reject(new Error(`JSON解析失败:${parseErr.message},原始返回内容:${data}`)); } }); }).on("error", (reqErr) => { reject(reqErr); }); }); }
定时触发函数
exports.updateCoinPrices = functions.pubsub.schedule("every 5 minutes") .onRun(async (context) => { try { // 传入合法的路径参数,无需携带域名 const result = await requestPromise("/v1/cryptocurrency/listings/latest?start=1&limit=10&convert=USD"); console.log("拉取到的接口数据:", result); } catch (error) { console.error("请求出错:", error); } return null; });
内容的提问来源于stack exchange,提问作者Doug Ray
相关产品推荐
相关产品推荐

