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

无Content-Type头时无法获取Firebase Functions请求体值的问题

解决Firebase Functions无Content-Type时无法解析请求体的问题

问题原因

Firebase Functions的HTTP触发器底层会预先处理请求,当第三方调用未携带Content-Type头时,默认不会自动解析请求体;同时body-parser.json()仅会解析Content-Type为application/json的请求,即使手动设置请求头,也可能因Firebase的请求对象特性或中间件执行时机问题,导致body-parser无法正常工作。

解决方案

方案1:手动读取请求流解析JSON

直接读取请求的数据流,手动转换为JSON格式,不依赖body-parser:

const functions = require("firebase-functions");
const fetch = require('node-fetch');
const express = require('express');
const app = express();

app.post('/', (request, response) => {
  let rawBody = '';
  // 监听数据片段
  request.on('data', (chunk) => {
    rawBody += chunk.toString();
  });
  // 数据接收完成后解析
  request.on('end', () => {
    try {
      const parsedBody = JSON.parse(rawBody);
      // 提取所需字段
      const statusCode = parseInt(parsedBody.request_status_code);
      const txnID = parsedBody.merchant_transaction_id;
      const amountPaid = parsedBody.amount_paid;
      const userID = parsedBody.account_number;
      
      console.log(parsedBody);
      // 执行你的业务逻辑...
      
      response.status(200).send('处理成功');
    } catch (err) {
      console.error('请求体解析失败:', err);
      response.status(400).send('无效的请求体格式');
    }
  });
});

// 导出Firebase函数
exports.yourApiFunction = functions.https.onRequest(app);

方案2:使用raw-body库(更健壮)

安装raw-body库处理请求体,它能更稳定地读取原始请求数据:

  1. 安装依赖:
npm install raw-body
  1. 修改函数代码:
const functions = require("firebase-functions");
const fetch = require('node-fetch');
const express = require('express');
const getRawBody = require('raw-body');
const app = express();

app.post('/', async (request, response) => {
  try {
    // 读取原始请求体
    const rawBodyBuffer = await getRawBody(request);
    const parsedBody = JSON.parse(rawBodyBuffer.toString());
    
    // 提取字段
    const statusCode = parseInt(parsedBody.request_status_code);
    const txnID = parsedBody.merchant_transaction_id;
    const amountPaid = parsedBody.amount_paid;
    const userID = parsedBody.account_number;
    
    console.log(parsedBody);
    // 业务逻辑处理...
    
    response.status(200).send('处理成功');
  } catch (err) {
    console.error('解析失败:', err);
    response.status(400).send('无效请求');
  }
});

exports.yourApiFunction = functions.https.onRequest(app);

注意事项

  • 原代码存在语法错误:request.headers行无实际作用且缺少分号,末尾的)};应改为});,需修正避免函数报错。
  • 务必添加错误捕获逻辑,防止请求体格式错误导致函数崩溃。

内容的提问来源于stack exchange,提问作者coDeR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:35:35