我一直在尝试使用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);
}
);
从代码中可以看出,我正在注册一个新用户。现在,我可以等到我完成所有逻辑以发回响应,但我认为如果我在发送响应之后做了一些不那么重要的事情,它会使用户看起来更快。我愿意更改我的代码以执行所有发送响应的内容,但我想确保没有我尚未尝试过的解决方案。
答案 0 :(得分:0)
和Express JS一样棒,它没有时间旅行功能,允许你取消发送请求:)这实际上是你问题的根源。如果您的回复必须显示结果,则必须等到所有相关操作完成。