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

Firestore转BigQuery Stream扩展转换函数JSON响应无效报错

Firestore to BigQuery Stream扩展转换函数JSON响应错误排查

错误信息

未处理的错误 FetchError: 在https://us-east4-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>处的JSON响应体无效,原因:JSON第1位出现意外的<标记

原代码示例

完整转换代码

const functions = require('@google-cloud/functions-framework');
functions.http('eventsTransformFunction', (req, res) => {
 
  const inputPayload = req.body;
    const inputData = inputPayload.data[0];
    const outputPayload = [{
        insertId: inputData.insertId,
        json: {
            timestamp: inputData.json.timestamp,
            event_id: inputData.json.event_id,
            document_name: inputData.json.document_name,
            document_id: inputData.json.document_id,
            operation: inputData.json.operation,
            data: JSON.stringify({ createdAt: { _seconds: 1664983515, _nanoseconds: 745000000 }, name: "Transformed Name" })
        },
    }]

    res.send({ data: outputPayload });
});

简化测试代码

const functions = require('@google-cloud/functions-framework');
functions.http('eventsTransformFunction', (req, res) => {
 
    res.send(req.body).status(200);
});

问题根源与解决办法

错误中的<标记说明函数返回的不是合法JSON,而是HTML错误页面(比如函数执行报错时的默认错误页),核心问题有两个:

  1. 响应方法调用顺序错误
    原简化代码中res.send(req.body).status(200)的顺序逻辑错误:send()会立即发送响应并结束请求,后续的status()无法修改响应状态,可能导致响应头异常,触发函数返回HTML错误页。

  2. 未处理异常与输入校验
    原代码没有异常捕获机制,若inputPayload.data为空或未定义,访问inputData.insertId会直接报错,Cloud Functions会返回默认的HTML错误页面,而非预期的JSON响应。

修正后的代码示例

修正后的简化测试代码

const functions = require('@google-cloud/functions-framework');
functions.http('eventsTransformFunction', (req, res) => {
  // 先设置状态码再发送响应
  res.status(200).send(req.body);
});

带异常处理与输入校验的完整转换代码

const functions = require('@google-cloud/functions-framework');
functions.http('eventsTransformFunction', (req, res) => {
  try {
    const inputPayload = req.body;
    // 校验输入数据合法性
    if (!inputPayload?.data?.length) {
      return res.status(400).send({ error: '无效的输入数据格式' });
    }

    const inputData = inputPayload.data[0];
    const outputPayload = [{
        insertId: inputData.insertId,
        json: {
            timestamp: inputData.json.timestamp,
            event_id: inputData.json.event_id,
            document_name: inputData.json.document_name,
            document_id: inputData.json.document_id,
            operation: inputData.json.operation,
            data: JSON.stringify({ createdAt: { _seconds: 1664983515, _nanoseconds: 745000000 }, name: "Transformed Name" })
        },
    }];

    res.status(200).send({ data: outputPayload });
  } catch (err) {
    console.error('转换函数执行错误:', err);
    // 捕获异常后返回JSON格式错误响应
    res.status(500).send({ error: '内部服务器错误' });
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:12