【问题标题】:Error handling in Express JS after response响应后 Express JS 中的错误处理
【发布时间】:2014-02-04 15:14:33
【问题描述】:

我一直在尝试使用 Express 的不同错误处理技术。首先我只是使用process.on('uncaughtException')。我很快就知道这是不好的做法。之后,我尝试在节点 js 中使用新的“域”功能。我将每个请求包装在一个域中,但是,如果我要发送响应然后在服务器上做更多的工作(处理相同的请求),它不会在响应发送后从这些函数中捕获错误。然后我尝试使用next(err) 转移到 Express 的内置错误处理。但是,我遇到了同样的情况。如果我发送响应,然后在发送响应后函数出现错误,则不会调用我的错误处理程序。下面是一些代码作为示例。

async.waterfall([
        function(after)
        {
            hashPassword(password, after);
        },
        function(hash, after)
        {
            makeToken(hash, after);
        },
        function(hash, token, after)
        {
            insertUserInfo(email, username, hash, ip, token, after);
        },
        function(token, id, after)
        {
            req.session.attempts = 0;
            res.json({ err: 0, attempts: 0 }); //Response is sent
            after(null, token, id);
        },
        function(token, id, after)
        {
            sendEmail(token, email, renderEmail); //Errors not caught
            makeFolder(id, after); //Errors not caught
        }
    ], function(err) {

        if(err)
            next(err);

    }
);

从代码中可以看出,我正在注册一个新用户。现在,我可以等到我完成所有逻辑后再发回响应,但我认为如果我在响应发送后执行一些不太重要的事情,它会使用户的请求看起来更快。我愿意更改我的代码以执行所有操作然后发送响应,但我想确保没有我尚未尝试过的解决方案。

【问题讨论】:

    标签: javascript node.js error-handling express


    【解决方案1】:

    尽管 Express JS 很棒,但它没有时间旅行功能,让您可以取消发送请求 :) 这确实是您问题的根源。如果您的响应必须显示结果,则必须等到所有相关操作完成。

    【讨论】:

    • 感谢您的回答!我同意我试图通过过早发送响应来偷工减料。但是,当我发送响应时,我已经完成了用户可以输入的所有内容,因此不再向他们显示错误。我只是对为我的日志捕获这些错误感兴趣,这样我就可以在它们发生时检测到任何问题。我可以看到这似乎是我在问很多 Express,但我只是想看看是否存在解决方案。
    • 我明白了。如果我理解正确,你不能调用 next() 来向 Express 发出你已经完成的信号吗?就用户而言,这就是结束。但是,这并不意味着您不能侦听在 Express 发送请求后很长时间触发的错误事件。这些事件侦听器可以进行日志记录等,甚至向用户发送电子邮件,而不是调用 done(err)。还是我找错树了?
    • 确实如此。我可以设置另一个错误处理系统来处理响应后的错误,但是当我记录错误时我将不再拥有请求对象来收集有关用户的详细信息,并且我将无法使用next()。我想在发送响应后无论如何都没有做我想做的事情。
    • 我认为请求对象和用户对象仍然可以通过关闭从您的处理程序中访问,因此即使请求流处于关闭状态,它的伴随信息(例如请求标头)也不会'还没有被垃圾回收。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2018-02-11
    • 2019-01-03
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多