本地运行Firebase HTTP函数出现ECONNRESET错误求助
问题描述
我有一些Firebase Cloud Functions,通过axios调用第三方外部API获取数据。生产环境用firebase deploy部署后运行正常,但本地运行时会出现ECONNRESET错误,Firebase模拟器还会提示Your function timed out after ~60s. To configure this timeout...,但实际错误在约10秒后就出现了。添加日志后发现连接在调用外部API的节点终止。检查过异步代码逻辑没发现问题,用Postman和curl调用本地端点都有同样问题。当前环境为Mac、node v18,希望解决本地运行函数的问题。
相关代码如下:
export const createThing = functions .region(<region>) .https.onRequest(async (request, response) => { try { const userId = await getRequestUserId(request); const someObject = await generateObject(request.body, userId); response.send(someObject); } catch (err) { console.log(err); response.status(500).send(err); } });
async function generateObject(inputs: any, userId?: string): Promise<string> { const object = await makeAPIRequest(inputs); return object }
async function makeAPIRequest(prompt: string) { const requestData = { <some data> }; const requestOptions = { method: "POST", headers: {"content-type": "application/json"}, data: requestData, url: <some endpoint>, }; return axios(requestOptions) .then((res) => { const output = res.data[0]; return output; }); }
解决方向
- 排查本地网络拦截:Mac本地的代理工具(如Charles、Clash)或防火墙可能拦截了axios的外部请求,导致连接重置。可以临时关闭代理/防火墙,再测试函数是否正常调用API。
- 给axios添加超时与重试:明确设置axios请求的超时时间,避免模拟器误报超时,同时添加重试逻辑应对临时连接异常。修改
makeAPIRequest函数:async function makeAPIRequest(prompt: string) { const requestData = { <some data> }; const requestOptions = { method: "POST", headers: {"content-type": "application/json"}, data: requestData, url: <some endpoint>, timeout: 15000, // 设为15秒超时 }; // 手动实现简单重试逻辑 let retryCount = 0; const maxRetry = 2; while (retryCount <= maxRetry) { try { const res = await axios(requestOptions); return res.data[0]; } catch (err) { retryCount++; if (retryCount > maxRetry) { console.error("API请求最终失败:", err); throw err; } await new Promise(resolve => setTimeout(resolve, 1000)); // 间隔1秒重试 } } } - 更新Firebase工具链:旧版本的Firebase CLI或模拟器可能存在网络兼容问题,执行
npm install -g firebase-tools更新到最新版本,重启模拟器后再测试。 - 强制axios使用IPv4:部分Mac环境下IPv6可能导致外部API连接异常,给axios指定使用IPv4:
import axios from 'axios'; import http from 'http'; import https from 'https'; // 创建强制IPv4的代理 const httpAgent = new http.Agent({ family: 4 }); const httpsAgent = new https.Agent({ family: 4 }); async function makeAPIRequest(prompt: string) { const requestData = { <some data> }; const requestOptions = { method: "POST", headers: {"content-type": "application/json"}, data: requestData, url: <some endpoint>, httpAgent, httpsAgent }; try { const res = await axios(requestOptions); return res.data[0]; } catch (err) { console.error("API请求失败:", err); throw err; } } - 检查API访问限制:确认第三方API是否限制本地IP访问,你的公网IP是否在API的白名单中,或者是否需要在本地请求时添加额外的认证头参数。
内容的提问来源于stack exchange,提问作者Tys
相关产品推荐
相关产品推荐

