【问题标题】:Getting "TypeError: Cannot read property 'catch' of undefined" when executing a mailgun cloud function in firebase在firebase中执行mailgun云功能时出现“TypeError:无法读取未定义的属性'catch'”
【发布时间】:2019-12-08 23:29:39
【问题描述】:

我正在尝试使用 mailgun 和 firebase 云功能发送电子邮件。邮件已发送,但仍返回导致我的应用程序崩溃的错误。我相信这是由错误引起的: TypeError:无法读取未定义的属性“catch” 在exports.sendReportRequest.functions.https.onRequest (/srv/lib/index.js:57:9)

在我的代码中,我使用 mailgun 的 mailgun-js 模块来发送电子邮件,并且我直接从文档中复制了代码。但是,firebase 要求我“正确处理承诺”,即使用 .catch 来捕获任何错误。但是,一旦部署,firebase 似乎无法将 .send() 识别为承诺,并引发错误。

这是针对 Flutter 应用程序的,每当我运行云函数时,我的应用程序就会崩溃,并且函数会在 firebase 日志中引发错误。

我已经在使用 blaze 计划,因此可以使用外部 API 调用。实际上,电子邮件已发送,但仍会引发使我的应用程序崩溃的错误。域名和apikey没有问题,否则邮件发不出去。

我尝试过使用 onRequest、onCall 和 trigger 函数,但它们都抛出相同的错误。

我尝试过返回承诺而不返回,但无济于事。现在我没有返回任何东西(或返回 void)。

// MailGun cloud function
export const sendReportRequest = functions.https.onCall((data, context) => {
    console.log("REPORT SENT");
    const sendData = {
        from: 'Excited User <me@samples.mailgun.org>',
        to: 'xxxx@gmail.com',
        subject: 'Hello',
        text: 'Testing some Mailgun awesomeness!'
    };

    mg.messages().send(sendData, (error, body) => {
        if (error) { console.log("error!", error); }
        console.log("message sent:", body);
    })
        .catch((err) => { console.log("error", err); });
});

错误

TypeError: Cannot read property 'catch' of undefined
    at Object.<anonymous> (/srv/lib/index.js:55:9)
    at Generator.next (<anonymous>)
    at /srv/lib/index.js:7:71
    at new Promise (<anonymous>)
    at __awaiter (/srv/lib/index.js:3:12)
    at exports.sendReportRequest.functions.https.onRequest (/srv/lib/index.js:43:69)
    at cloudFunction (/srv/node_modules/firebase-functions/lib/providers/https.js:57:9)
    at /worker/worker.js:783:7
    at /worker/worker.js:766:11
    at _combinedTickCallback (internal/process/next_tick.js:132:

【问题讨论】:

  • 猜测mg.messages().send(...) 返回未定义,而不是承诺。
  • 代码建议说 .send() returnPromise,所以这是一个承诺.. 只是在部署时显然不是。
  • 文档对promises 有话要说。 “当没有将回调传递给函数时,会返回 Promise...”

标签: javascript typescript firebase mailgun


【解决方案1】:

那是因为 send 可能没有返回一个 Promise,而是使用回调方法。您会注意到,因为您向它传递了一个函数,该函数接收 mg.messages().send(sendData, *(error, body)* =&gt; { 行中的返回数据。

这意味着它后面没有catch 短语。你在回调函数中得到错误,所以就在那里处理它,或者如果你真的想要你可以用 try 包装它并抛出错误,而不是在外面捕获它,就像这样:

try {
   mg.messages().send(sendData, (error, body) => {
       if (error) { throw new Error(error); }
       console.log("message sent:", body);
   })
} catch(e) {
 // handle error
}

作为旁注,我去了 mailgun-js github repo 尝试为您获取文档示例,我看到它已存档并且不再受支持...您可能想考虑使用另一个库:)

另外,here 是我发现的一篇不错的文章,它很好地解释了整个回调/承诺/异步等待混乱,有什么区别以及如何以及何时使用它们,如果您想了解更多信息。

【讨论】:

  • 抱歉忘记补充了,我已经尝试过了,但是当我在函数上运行 lint 时,我仍然得到“必须正确处理承诺”。我认为 mailgun 将它们的功能定义为一个承诺,而它不知何故不是......? Firebase 只是注意到一个未处理的承诺并引发错误。
  • 我解决了哈哈...我刚刚完全删除了 (error, body) 回调。然后 .catch 和 .then 工作。也不需要 try-catch 块!
猜你喜欢
  • 2018-12-05
  • 2020-05-18
  • 2021-07-15
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2018-02-27
  • 2021-06-06
  • 2021-10-02
相关资源
最近更新 更多