我正在编写我的第一个云函数,它在本地运行良好,但在我将其部署到Firebase时就不起作用了。我正在尝试调用一个Cloud函数,该函数将使用Flutter Web通过HTTP请求发送电子邮件。我在网上读到,怀疑这可能是因为我无法兑现承诺。如何确保异步调用完成?
const nodemailer = require('nodemailer');
const cors = require('cors')({origin: true});
/**
* Here we're using Gmail to send
*/
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'dummyaccount@gmail.com',
pass: 'dummypassword'
}
});
exports.sendMail = functions.https.onRequest((req, res) => {
cors(req, res, () => {
return transporter.sendMail(req.body, (erro, info) => {
if(erro){
return res.send(erro.toString());
}
return res.send('Message send');
});
});
});
const admin = require('firebase-admin');
admin.initializeApp();
This is my Http Request using Dart for Flutter Web
void httpCallFunction() async {
var url =
'https://us-central1-fire-station-ope-blablala.cloudfunctions.net/sendMail';
var response = await http.post(
url,
body: json.encode({
"from": "Dummy Guy <Do-Not-Reply@gmail.com>",
"to": "$_email",
"subject": "Your Booking has been approved!!",
"html": approvedMessageTosent,
}),
headers: {
'Content-type': 'application/json',
},
);
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');
}
为了解决这个问题,我经历了一场过山车。因此,很明显,云功能日志返回时状态代码为204,并说我的"请求主体缺少数据",但我可以看到我的数据正在发送。
因此,我发现另一个人面临着与我在这个链接中所做的完全相同的问题:Dart json.encode没有按照Firebase Function 的需要进行编码
从本质上讲,我必须将数据封装在一个名为"data"的键中。
{
"data":{
"to":"john@doe.com",
"displayName":"Johnny",
"from":"JaneDoe",
}
}
https://firebase.google.com/docs/functions/callable-reference#request_body