Firebase功能与Sendgrid集成

问题描述

我对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;
    });
});
,

这里至少有两个编程问题。

  1. 您不会从所有异步工作完成后解析的函数中返回承诺。这是一个要求。调用then和`catch是不够的。实际上,您从函数处理程序中得到了一个承诺。

  2. 您正在调用sendGrid.send(email),但从未在代码中的任何地方定义变量email。如果是这种情况,那么您要将一个未定义的值传递给sendgrid。

您的项目也有可能不在付款计划中,在这种情况下,由于免费计划中缺少出站网络,对sendgrid的呼叫将始终失败。您将需要制定付款计划才能完全正常工作。