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

Firebase Node.js云函数接收Mailgun回调时无法解析form-data请求

解决Firebase云函数无法解析Mailgun收件回调form-data的问题

我之前也碰到过类似的坑,你的问题主要出在multer的使用方式错误,还有请求响应变量名搞混了,另外body-parser没法处理multipart/form-data类型的请求,这才导致拿不到Mailgun回调里的字段。

先理清楚你的问题场景:

我在Firebase Node.js云函数中使用Mailgun的收件回调功能,但无法在request变量中获取到form-data请求,需要获取app.body.subject、app.body.text、app.body.to等数据

你的原代码:

var functions = require('firebase-functions'); 
var admin = require('firebase-admin'); 
var serviceAccount = require("./service-account.json"); 
var apn = require('apn'); 
var firebase = require("firebase"); 
const express = require('express'); 
const cors = require('cors'); 
const app = express(); 
var bodyParser = require('body-parser'); 
var multer = require('multer'); 
var upload = multer(); 

app.use(cors({origin: true})); 
app.use(bodyParser.urlencoded({extended: false})); // for parsing 
app.use(multer); 

exports.receivedEmail = functions.https.onRequest((app, response) => { 
  console.log("app res : " + app.body); 
  response.status(200).json({ "msg": "success", "error": false }); 
}); 

Mailgun返回的form-data内容:

Content-Disposition: form-data; name="recipient"
monica@sandbox51a77de723e741c3b046c60910ee1e48.mailgun.org
--362eb63be3174fc4a7299a0f269f5038
Content-Disposition: form-data; name="sender"
chandler@sandbox51a77de723e741c3b046c60910ee1e48.mailgun.org
--362eb63be3174fc4a7299a0f269f5038
Content-Disposition: form-data; name="subject"
Re: Sample POST request
--362eb63be3174fc4a7299a0f269f5038
Content-Disposition: form-data; name="from"

问题分析

  1. multer使用错误:你直接把multer模块传给app.use(),但正确的做法是使用multer创建的实例方法,比如upload.none()(因为Mailgun的回调只有文本字段,没有文件上传)。
  2. 变量名混淆:云函数的onRequest回调参数应该是(req, res),你写成了(app, response),这里的app其实是请求对象,和你上面定义的express实例重名了,容易搞混。
  3. body-parser多余:body-parser.urlencoded只能处理application/x-www-form-urlencoded类型的请求,处理不了multipart/form-data,所以这个可以去掉,multer会负责解析form-data。

修改后的代码

var functions = require('firebase-functions'); 
var admin = require('firebase-admin'); 
var serviceAccount = require("./service-account.json"); 
var apn = require('apn'); 
var firebase = require("firebase"); 
const express = require('express'); 
const cors = require('cors'); 
const app = express(); 
var multer = require('multer'); 
var upload = multer(); 

// 配置CORS
app.use(cors({origin: true})); 
// 使用multer解析无文件的form-data
app.use(upload.none()); 

exports.receivedEmail = functions.https.onRequest((req, res) => { 
  // 现在可以正常获取form-data里的字段了
  console.log("收件人:", req.body.recipient);
  console.log("发件人:", req.body.sender);
  console.log("主题:", req.body.subject);
  
  res.status(200).json({ "msg": "success", "error": false, data: req.body }); 
}); 

验证说明

修改后重新部署云函数,当Mailgun触发回调时,你就能在云函数的日志里看到req.body里的所有字段了,比如req.body.subject、req.body.text这些都能正常获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:25:38