Firebase Cloud Functions读取JSON Body异常问题排查
解决Firebase Cloud Functions中req.body无法读取jsonPayload的问题
核心原因排查
Firebase的HTTP函数基于Express框架,默认仅自动解析Content-Type为application/json的请求体。如果触发Webhook发送请求时未设置正确的请求头,req.body可能只是原始字符串而非解析后的JSON对象——functions.logger.log会自动将字符串转为可读格式,但直接用req.body.jsonPayload或req.body["jsonPayload"]自然会返回undefined。
解决方案
方案1:修正Webhook请求头
让Webhook的请求头Content-Type设为application/json,Express会自动将请求体解析为JSON对象,此时就能直接通过req.body.jsonPayload.reaction读取目标值。
方案2:手动解析请求体
若无法修改Webhook配置,可在云函数里手动解析原始请求体:
exports.sendReactionNotification = functions.https.onRequest(async (req, res) => { console.log("received reaction"); // 手动将原始请求体解析为JSON const body = JSON.parse(req.rawBody); functions.logger.log(body); console.log(body["jsonPayload"]); // 用可选链避免字段不存在时报错 console.log(body.jsonPayload?.reaction); return res.status(200).send("Success"); });
方案3:强制添加JSON解析中间件
通过Express中间件强制解析所有请求的JSON体,忽略请求头限制:
const express = require('express'); const app = express(); // 强制解析所有请求的JSON格式 app.use(express.json({ type: '*/*' })); app.post('/', async (req, res) => { console.log("received reaction"); functions.logger.log(req.body); console.log(req.body["jsonPayload"]); console.log(req.body.jsonPayload?.reaction); return res.status(200).send("Success"); }); exports.sendReactionNotification = functions.https.onRequest(app);
验证步骤
先在云函数中打印typeof req.body:
- 若输出为
string,说明请求体未被自动解析,需用上述方案处理; - 若输出为
object,检查req.body结构是否与预期一致,排除字段拼写错误(比如大小写不符)。
内容的提问来源于stack exchange,提问作者youcantgetridofmestackoverflow
相关产品推荐
相关产品推荐

