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"
问题分析
- multer使用错误:你直接把
multer模块传给app.use(),但正确的做法是使用multer创建的实例方法,比如upload.none()(因为Mailgun的回调只有文本字段,没有文件上传)。 - 变量名混淆:云函数的
onRequest回调参数应该是(req, res),你写成了(app, response),这里的app其实是请求对象,和你上面定义的express实例重名了,容易搞混。 - 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
相关产品推荐
相关产品推荐

