AWS Node.js Lambda调用Facebook Conversions API无数据发送问题求助
Lambda调用Facebook Conversions API无响应日志问题排查
问题现状
- 数据可通过API网关和外部GET请求正常传入Lambda函数
- 函数执行后无Facebook响应日志,无法确认数据是否发送成功
- 已将Lambda超时调整至30秒,函数未部署在私有VPC中
代码问题分析
从提供的代码来看,存在以下几个关键问题导致无响应日志:
- 请求选项配置错误:
port被错误地放在headers对象中,它应该是options的顶级属性 - 请求体格式不符合API要求:Facebook Conversions API要求请求体是包含
data字段的对象,而非外层包裹数组 - 错误事件监听位置错误:请求层面的错误应监听在
req对象上,而非res对象 - Lambda异步处理不规范:未确保异步请求完成后再结束Lambda执行,可能导致函数提前退出
修正后的代码
const https = require('https'); exports.handler = async (event) => { // 假设变量从event中获取,可根据实际传入逻辑调整 const pixelId = event.pixelId; const access_token = event.access_token; const conversionEvent = event.conversionEvent; const current_timestamp = Math.floor(Date.now() / 1000); const site = event.site; const email = event.email; const phone = event.phone; const fName = event.fName; const lName = event.lName; const userIp = event.userIp; const userState = event.userState; const userZip = event.userZip; const userCity = event.userCity; const clickId = event.clickId; const path = `/v15.0/${pixelId}/events?access_token=${access_token}`; const options = { method: 'POST', hostname: 'graph.facebook.com', path: path, port: 443, // 移至options顶级属性 headers: { 'Content-Type': 'application/json' } }; // 修正请求体格式:移除外层数组 const body = { data: [ { event_name: conversionEvent, event_time: current_timestamp, action_source: "website", event_source_url: site, event_id: `${current_timestamp}-${Math.floor(Math.random() * 1000)}`, // 生成更唯一的事件ID user_data: { em: email, phone: phone, fn: fName, ln: lName, client_ip_address: userIp, st: userState, zp: userZip, ct: userCity, fbc: clickId } } ] }; console.log("请求体内容:", JSON.stringify(body)); return new Promise((resolve, reject) => { const req = https.request(options, (res) => { const chunks = []; res.on("data", (chunk) => { chunks.push(chunk); }); res.on("end", () => { const responseBody = Buffer.concat(chunks).toString(); console.log("Facebook响应状态码:", res.statusCode); console.log("Facebook响应内容:", responseBody); console.log("请求结束"); resolve({ statusCode: 200, body: JSON.stringify("Success") }); }); }); // 监听请求层面的错误 req.on("error", (error) => { console.error("请求Facebook出错:", error); reject({ statusCode: 500, body: JSON.stringify(`Error Posting Data to Facebook: ${error.message}`) }); }); req.write(JSON.stringify(body)); req.end(); }); };
关键修改说明
- 将
port从headers移到options顶级属性,确保请求端口配置正确 - 移除请求体外层的数组,符合Facebook Conversions API的格式要求
- 将
error事件监听从res对象移到req对象,捕获请求阶段的错误 - 使用
Promise包裹异步请求,确保Lambda等待请求完成后再返回响应,避免提前退出 - 增强日志输出,添加响应状态码,便于精准排查问题
验证步骤
- 部署修正后的Lambda函数
- 发起请求后查看CloudWatch日志,确认是否有
Facebook响应状态码和Facebook响应内容的输出 - 若状态码为200,可登录Facebook事件管理工具查看事件是否被正常接收;若为错误码,根据响应内容排查具体问题
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

