2016-10-10 69 views
-1

我对Express很熟悉,但对Restify很陌生。的RESTify的文件有许多例子呼吁res.send()如下之后next()Resitfy中res.send()之后调用next()有什么意义?

server.get('/echo/:name', function (req, res, next) { 
    res.send(req.params); 
    return next(); 
}); 

这看起来像一些的RESTify专家以及推荐模式:

The consequences of not calling next() in restify

什么是这样做的实际使用情况?在你打电话给res.send()之后,有没有链条中的下一个处理程序可以做的事情?

+0

当然,它可能会做额外的数据库工作或请求跟踪等,但是......如果您没有这样做,为什么要调用.next?这样做可以使未来的处理程序可以在您不返回的情况下继续工作,因为无论如何,调用.next并没有真正的伤害,只要知道如果多条路线碰巧发生了相同的请求,则只有其中一个可以成功调用'res.send',第二个会导致错误。 –

+1

@Kevin B:谢谢你的回答。这就是'后期渲染'类型中间件的情况,对吧?请阅读我的意见,让我知道你的想法。 – Max

+0

正确。我同意你的结论,只有当你知道你在做什么时才这样做。 –

回答

1

当我做了一些更多的研究后,我想我找到了答案。

只有在res.send()之后调用next()的实际用例是,当您想安装'post-render'类型中间件以在路由handers完成作业后捕获所有事务。

在其他情况下,它只是为每个请求和每个请求添加不必要的开销,因为它会扫描其余路由以查找下一个匹配。

大多数中间件都是“预渲染”类型,无论如何都不需要调用next()。即使对于后渲染类型的中间件,依赖于next()的自愿调用也是非常危险的。您宁愿要使用更多防错方法,如https://github.com/jshttp/on-finished

res.send()之后调用next()在大多数情况下会导致不必要的开销。只有在绝对需要时才能使用它,并且知道自己在做什么。

+0

感谢您的洞察力 - 我认为应该指出,特别是如果您使用任何时间或日志记录行为,那么您可能总是需要在send()之后调用next() - 性能开销或不。因此,如果你是一位图书馆作者,请阅读此内容..请彬彬有礼,并调用'next()',以便在导入模块时不会无意中破坏人们的应用程序。 – pospi