在Firebase中执行Mailgun云函数时,获取“ TypeError:无法读取未定义的属性'catch'”

时间:2019-07-31 12:34:30

标签: javascript typescript firebase mailgun

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

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

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

我已经在使用大火计划,因此可以使用外部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:

1 个答案:

答案 0 :(得分:0)

这是因为send可能未返回承诺,而是使用了回调方法。您会注意到,由于传递了一个函数,该函数在行gl_readdir = (struct dirent *(*)(void *))readdir;中接收返回的数据。

这意味着后面没有mg.messages().send(sendData, *(error, body)* => {短语。您会在回调函数中收到错误,因此只需在其中进行处理即可,或者,如果您真的希望您可以尝试将错误包装起来并抛出错误,那么可以将其捕获到外部,如下所示:

catch

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

此外,here是我发现的一篇不错的文章,如果您想了解更多信息,它可以很好地解释整个回调/ promises / async-await混乱,有什么区别以及如何以及何时使用它们。