快速和下一个方法使用而不返回

时间:2014-04-22 16:09:58

标签: node.js express

在express中,我们可以调用next()next(Error)方法来调用下一个函数。 我通过实现以下代码犯了一个初学者错误:

if(error) {
    next(new Error('This is an error');
}
console.log("Don't display this if error.");

在调用next方法后,在控制台中打印文本时出现大问题。我不得不通过以下方式更改代码:

if(error) {
    return next(new Error('This is an error');
}
console.log("Don't display this if error.");

现在,它工作正常。

我的问题:在退货声明之外调用下一个方法有什么好处吗? 我的理解是,这将创建一个很难调试/维护的多路径执行。

2 个答案:

答案 0 :(得分:0)

可能会帮助您按照以下方式考虑您的代码:

if(error) {
    // Let somebody else do something with the error.
    next(error);

    // Don't to anything else here.
    return;
}

console.log("No error, then do something here");

使用return next(error)只是一种较短的写作方式。

答案 1 :(得分:0)

要回答原始问题,是的,不返回next()是有价值的。具体示例:您有一个快速应用程序,并定义了要使用的错误处理程序中间件函数。现在,在该函数中,您将错误附加到connect-flash以便稍后在jade模板中检索,并通过Bootstrap通知显示给用户。

现在,您不希望通过返回next()来保留原始回调执行。假设您向服务器提交了一个表单,发生错误,现在您必须在返回浏览器之前重新呈现您的jade模板中的数据。因此,您仍将继续执行并返回原始函数(req,res,next)并呈现响应,但是通过connect-flash Jade也将注入错误消息,而您只需要“出现错误时的受控渲染”而非而不是将所有问题汇集到一个常见的“Opps something broke”页面。

同样调用next()只是调用执行管道上的下一个中间件(因此,为什么重要的是你声明app.use中间件的顺序)。您可以通过node.js中间件进行身份验证,也可以执行许多令人惊叹的事情。在你的情况下,使用err调用Next将绕过所有正常的中间件并执行4 params错误处理程序(根据快速规范)。