Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript expressjs响应后的错误处理_Javascript_Node.js_Error Handling_Express - Fatal编程技术网

Javascript expressjs响应后的错误处理

Javascript expressjs响应后的错误处理,javascript,node.js,error-handling,express,Javascript,Node.js,Error Handling,Express,我一直在用Express尝试不同的错误处理技术。首先,我只是使用了process.on('uncaughtException')。我很快就知道这是一种坏习惯。之后,我尝试在NodeJS中使用新的“域”特性。我将每个请求包装在一个域中,但是,如果我发送一个响应,然后在服务器上做更多的工作(处理相同的请求),那么在发送响应后,它将不会捕获这些函数中的错误。然后,我尝试使用next(err)使用Express进行内置错误处理。然而,我也遇到了同样的情况。如果我发送了一个响应,然后一个函数在响应发送后出

我一直在用Express尝试不同的错误处理技术。首先,我只是使用了
process.on('uncaughtException')
。我很快就知道这是一种坏习惯。之后,我尝试在NodeJS中使用新的“域”特性。我将每个请求包装在一个域中,但是,如果我发送一个响应,然后在服务器上做更多的工作(处理相同的请求),那么在发送响应后,它将不会捕获这些函数中的错误。然后,我尝试使用
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);

    }
);

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

尽管Express JS非常棒,但它没有允许您取消发送请求的时间旅行功能:)这确实是您问题的根源。如果您的回答必须显示结果,则必须等待所有相关操作完成。

谢谢您的回答!我同意,我试图通过提前发送回复来抄近路。然而,当我发送响应时,我已经完成了用户可以输入的所有内容,因此没有更多的错误显示给他们。我只是想为我的日志捕获这些错误,以便在出现问题时能够检测到它们。我可以看出这看起来像是我问了很多问题,但我只是好奇,想看看是否存在解决方案。我明白了。如果我理解正确的话,您不能调用next()来向Express发出完成的信号,就用户而言,这就是结束。但是,这并不意味着您不能在Express发送请求后很长时间内侦听引发的错误事件。这些事件侦听器不需要调用done(err),而是可以进行日志记录等操作,甚至可以向用户发送电子邮件。还是我找错树了?没错。我可以设置另一个错误处理系统,在响应后处理错误,但当我记录错误时,我将不再有请求对象来收集有关用户的详细信息,并且我将无法使用
next()
。我想在发送响应后,我根本就不想做我想做的事情。我认为请求对象和用户对象仍然可以通过闭包从处理程序访问,因此即使请求流处于关闭状态,它的助理信息(例如请求头)也不会被垃圾收集。