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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:05:51