问题描述
我对Firebase函数还很陌生,我试图创建一个简单的onCreate()触发器,但是似乎无法启动并运行它。
我不是用Sendgrid正确返回诺言吗?不知道我在想什么
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const sendGrid = require("@sendgrid/mail");
admin.initializeApp();
const database = admin.database();
const API_KEY = '';
const TEMPLATE_ID = '';
sendGrid.setApiKey(API_KEY);
const actionCodeSettings = {
...
};
exports.sendEmailVerify = functions.auth.user().onCreate((user) => {
admin
.auth()
.generateEmailVerificationLink(user.email,actionCodeSettings)
.then((url) => {
const msg = {
to: user.email,template_id: TEMPLATE_ID,dynamic_template_data: {
subject: "test email",name: name,link: url,},};
return sendGrid.send(msg);
})
.catch((error) => {
console.log(error);
});
});
firebase函数的日志
sendEmailVerify
Function execution started
sendEmailVerify
Function returned undefined,expected Promise or value
sendEmailVerify
Function execution took 548 ms,finished with status: 'ok'
sendEmailVerify
{ Error: Forbidden
sendEmailVerify
at axios.then.catch.error (node_modules/@sendgrid/client/src/classes/client.js:133:29)
sendEmailVerify
at process._tickCallback (internal/process/next_tick.js:68:7)
sendEmailVerify
code: 403,sendEmailVerify
message: 'Forbidden',
解决方法
您没有在Cloud Function中正确返回Promises chain。您应该执行以下操作:
exports.sendEmailVerify = functions.auth.user().onCreate((user) => {
return admin // <- See return here
.auth()
.generateEmailVerificationLink(user.email,actionCodeSettings)
.then((url) => {
const msg = {
to: user.email,template_id: TEMPLATE_ID,dynamic_template_data: {
subject: "test email",name: name,link: url,},};
return sendGrid.send(msg);
})
.catch((error) => {
console.log(error);
return null;
});
});
,
这里至少有两个编程问题。
-
您不会从所有异步工作完成后解析的函数中返回承诺。这是一个要求。调用
then
和`catch是不够的。实际上,您从函数处理程序中得到了一个承诺。 -
您正在调用
sendGrid.send(email)
,但从未在代码中的任何地方定义变量email
。如果是这种情况,那么您要将一个未定义的值传递给sendgrid。
您的项目也有可能不在付款计划中,在这种情况下,由于免费计划中缺少出站网络,对sendgrid的呼叫将始终失败。您将需要制定付款计划才能完全正常工作。