You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Node.js Lambda调用Facebook Conversions API无数据发送问题求助

Lambda调用Facebook Conversions API无响应日志问题排查

问题现状

  • 数据可通过API网关和外部GET请求正常传入Lambda函数
  • 函数执行后无Facebook响应日志,无法确认数据是否发送成功
  • 已将Lambda超时调整至30秒,函数未部署在私有VPC中

代码问题分析

从提供的代码来看,存在以下几个关键问题导致无响应日志:

  1. 请求选项配置错误:port被错误地放在headers对象中,它应该是options的顶级属性
  2. 请求体格式不符合API要求:Facebook Conversions API要求请求体是包含data字段的对象,而非外层包裹数组
  3. 错误事件监听位置错误:请求层面的错误应监听在req对象上,而非res对象
  4. 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等待请求完成后再返回响应,避免提前退出
  • 增强日志输出,添加响应状态码,便于精准排查问题

验证步骤

  1. 部署修正后的Lambda函数
  2. 发起请求后查看CloudWatch日志,确认是否有Facebook响应状态码和Facebook响应内容的输出
  3. 若状态码为200,可登录Facebook事件管理工具查看事件是否被正常接收;若为错误码,根据响应内容排查具体问题

内容的提问来源于stack exchange,提问作者Ethan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:05:33