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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:45:35