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错误页面(比如函数执行报错时的默认错误页),核心问题有两个:
响应方法调用顺序错误
原简化代码中res.send(req.body).status(200)的顺序逻辑错误:send()会立即发送响应并结束请求,后续的status()无法修改响应状态,可能导致响应头异常,触发函数返回HTML错误页。未处理异常与输入校验
原代码没有异常捕获机制,若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
相关产品推荐
相关产品推荐

