Axios对接ActiveCampaign API在Firebase云函数中的错误捕获问题
解决Firebase云函数中Axios捕获ActiveCampaign错误信息的问题
问题出在你直接将Axios抛出的error对象返回给前端——Axios的错误对象包含不可序列化的属性,导致关键的错误响应数据无法正常传递。ActiveCampaign返回的错误详情实际存储在error.response.data中,需要显式提取后返回。
具体解决步骤:
- 区分Axios错误类型:Axios抛出的错误分两种:服务器返回非2xx状态码的响应错误(有
error.response属性),以及网络/请求配置错误(无error.response属性)。 - 提取错误详情:对于响应错误,提取
error.response.data(ActiveCampaign的错误信息)、error.response.status(状态码);对于其他错误,返回通用提示。 - 避免直接返回Error对象:Error对象的很多属性无法被JSON序列化,必须提取可序列化的字段返回。
修改后的代码
const functions = require("firebase-functions"); const axios = require("axios"); const cors = require("cors")({ origin: true }); const addTagToContact = async (contactId: string, tagId: string) => { try { await axios({ method: "post", url: "https://xyz.api-us1.com/api/3/contactTags", headers: { "Api-Token": "api-token", }, data: { contactTag: { contact: contactId, tag: tagId, }, }, }); } catch (e) { // 同步修改标签接口的错误处理逻辑 const error = e as any; console.error("Add tag error:", error.response?.data || error.message); } }; export const createNewContact = functions.https.onRequest((request: { body: any; }, response: { status: (arg0: number) => void; send: (arg0: { response?: unknown; status?: number; message?: string; }) => void; }) => { cors(request, response, async () => { const newContactData = request.body; if(!newContactData.email || !newContactData.fieldValues) { return response.send({ response: 'No contact data provided' }) } try { const responseActiveCampaign = await axios({ method: "post", url: "https://xyz.api-us1.com/api/3/contacts", headers: { "Api-Token": "api-token", "Content-Type": "application/json" }, data: { contact: newContactData, }, }); console.log('response active campaign console log', responseActiveCampaign) await addTagToContact(responseActiveCampaign.data.contact.id, "1") return response.send({ response: responseActiveCampaign.data }) } catch (error) { const axiosError = error as any; let errorResponse; let statusCode = 500; if (axiosError.response) { // 服务器返回了错误响应,提取ActiveCampaign的错误信息 errorResponse = axiosError.response.data; statusCode = axiosError.response.status; console.error('ActiveCampaign Error:', errorResponse); } else if (axiosError.request) { // 请求已发送但无响应 errorResponse = { message: "No response received from ActiveCampaign" }; console.error('Request Error:', axiosError.message); } else { // 请求配置错误 errorResponse = { message: axiosError.message }; console.error('Config Error:', axiosError.message); } response.status(statusCode); response.send({ response: errorResponse }); } }); });
说明
- 通过
axiosError.response.data可以直接获取ActiveCampaign返回的完整错误信息(比如重复联系人时的提示),这些信息可直接返回给前端展示。 - 针对不同错误场景做了区分,确保无论哪种错误都能返回清晰的信息给前端,同时在云函数日志中记录详细错误便于排查。
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

