如何修改Firebase V2云函数示例以读取POST请求体?
问题描述
我正在修改Firebase函数入门文档里的示例,要把原本获取GET请求参数的逻辑改成读取POST请求体。未修改的示例代码如下:
// The Cloud Functions for Firebase SDK to create Cloud Functions and triggers. const {logger} = require("firebase-functions"); const {onRequest} = require("firebase-functions/v2/https"); const {onDocumentCreated} = require("firebase-functions/v2/firestore"); // The Firebase Admin SDK to access Firestore. const {initializeApp} = require("firebase-admin/app"); const {getFirestore} = require("firebase-admin/firestore"); initializeApp(); // Take the text parameter passed to this HTTP endpoint and insert it into // Firestore under the path /messages/:documentId/original exports.addmessage = onRequest(async (req, res) => { // Grab the text parameter. const original = req.query.text; // Push the new message into Firestore using the Firebase Admin SDK. const writeResult = await getFirestore() .collection("messages") .add({original: original}); // Send back a message that we've successfully written the message res.json({result: `Message with ID: ${writeResult.id} added.`}); }); // Listens for new messages added to /messages/:documentId/original // and saves an uppercased version of the message // to /messages/:documentId/uppercase exports.makeuppercase = onDocumentCreated("/messages/{documentId}", (event) => { // Grab the current value of what was written to Firestore. const original = event.data.data().original; // Access the parameter `{documentId}` with `event.params` logger.log("Uppercasing", event.params.documentId, original); const uppercase = original.toUpperCase(); // You must return a Promise when performing // asynchronous tasks inside a function // such as writing to Firestore. // Setting an 'uppercase' field in Firestore document returns a Promise. return event.data.ref.set({uppercase}, {merge: true}); });
我试过.body、.text、.json()等方法,也参考过Fetch API文档,但搞不懂.body()的返回值,而且.json()总是undefined。Stack Overflow提到的req.body.data也没用,求解决。
解决方案
Firebase V2的HTTP函数基于Web标准Request对象,没有内置请求体解析,得手动处理。以下是修改后的addmessage函数:
exports.addmessage = onRequest(async (req, res) => { try { // 仅处理POST请求 if (req.method !== "POST") { return res.status(400).json({error: "仅接受POST请求"}); } // 验证并解析JSON请求体 let requestBody; if (req.headers["content-type"]?.includes("application/json")) { // 读取原始请求体文本再解析为JSON const rawBody = await req.text(); requestBody = JSON.parse(rawBody); } else { return res.status(400).json({error: "不支持的内容类型,请使用application/json"}); } // 提取text字段 const original = requestBody.text; if (!original) { return res.status(400).json({error: "请求体中缺少text字段"}); } // 写入Firestore const writeResult = await getFirestore() .collection("messages") .add({original: original}); res.json({result: `消息已添加,ID: ${writeResult.id}`}); } catch (error) { logger.error("处理请求出错:", error); res.status(500).json({error: "请求处理失败"}); } });
核心要点:
- Firebase V2的
req不是Express的请求对象,没有现成的req.body,得自己读取解析。 - 用
await req.text()获取原始请求体字符串,再用JSON.parse()转成JSON对象。 - 必须先检查
Content-Type是否为application/json,避免解析非JSON内容报错。 - 增加了完整的错误处理,覆盖请求方法错误、格式错误、字段缺失和服务器内部错误。
测试命令:
用curl发送POST请求测试:
curl -X POST -H "Content-Type: application/json" -d '{"text":"Hello Firebase"}' https://<你的项目ID>.cloudfunctions.net/addmessage
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

