【问题标题】:How do I prevent my node.js error middleware function from failing on subsequent function calls?如何防止我的 node.js 错误中间件函数在后续函数调用中失败?
【发布时间】:2020-07-05 00:15:38
【问题描述】:

我正在写一个身份验证。 node.js 网络服务器的路由。我正在使用 Express,它运行良好。

我遇到的问题是在发生错误时调用 sendMail() 函数。目前,我只是在测试路径中抛出一个新错误。

throw new Error('testing...');

因为我使用的是 express-async-errors 模块,所以如果路由中发生错误,程序流程会转到我的错误中间件函数。

效果很好。

但是在这个错误中间件函数中,我调用了我的 sendMail() 函数,它立即失败,给我与上面相同的错误:'testing...'

const sendEmail = require('../email/sendEmail');


// error middleware function
async function error(err, req, res, next) {
        const wasSent = await sendEmail('my-user-name@gmail.com', 'Error', err);
        console.log(wasSent);

        // http 500 - internal server error
        res.status(500).send("Something unexpected happened. Our team has been notified.");
}

结果是我在下面的 sendMail() 函数中的 catch 块被调用。 我做错了什么?

这是我的发送邮件功能:

const nodemailer = require("nodemailer");
const striptags = require('striptags');
const config = require('config');


async function sendEmail(to, subject, content) {
        try {
                // create reusable transporter object using the default smtp transport
                let transporter = nodemailer.createTransport({
                        host: config.get('emailHost'),
                        port: config.get('emailPort'),
                        secure: config.get('emailSecure'), // true for 465, false for other ports
                        auth: {
                                user: config.get('emailUsername'),
                                pass: config.get('emailPassword'),
                        },
                });

                // send mail with defined transport object
                let info = await transporter.sendMail({
                        from: config.get('emailFrom'), // sender address
                        to: to, // list of receivers
                        subject: subject,
                        text: striptags(content), // plain text body
                        html: content, // html body
                });

                // e.g. message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
                //console.log("message sent: %s", info.messageId);

                return true;
        }
        catch(ex) {
                console.log("error: sendEmail() invocation failed;", ex);
                return false;
        }
}

module.exports = sendEmail;

【问题讨论】:

  • exconsole.log 说什么?我相信striptags(content) 可能不起作用,因为content 可能是Error 对象而不是字符串。 Error 对象可能需要先序列化为字符串
  • 我刚刚想通了......它似乎是这一行: const wasSent = await sendEmail('my-user-name@gmail.com', 'Error', err);跨度>
  • 将“err”对象作为字符串发送会导致问题。

标签: javascript node.js express


【解决方案1】:

错误是“错误”对象。 一旦我使用 UTIL 将其转换为字符串,它就可以工作了。

const util = require('util');

...
const fullErrorTrace = util.inspect(err, { showHidden: false, depth: null }).replace(/[\r\n]/gm, '<br />');

const wasSent = await sendEmail('my-user-name@gmail.com', 'Error', fullErrorTrace);
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2017-06-06
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多