解决不能调用next()的后果

时间:2014-03-12 14:37:19

标签: node.js restify

我一直在使用Restify一段时间了。我遇到了一些缺少next()的代码,我发现我不确定是否完全理解为什么 next()应该在{{{{{}后调用的原因1}}。我明白为什么会在中间件情况下使用它,但对于正常的路由,为什么需要它呢?例如:

res.send()

VS

server.get('/a/:something/',function(req,res,next) {
    res.send('ok');
});

如果server.get('/b/:something/',function(req,res,next) { res.send('ok'); return next(); }); 被排除在代码之外,它似乎不会导致错误,并且可以从我能看到的内容中发挥作用。

2 个答案:

答案 0 :(得分:18)

restify API Guide有这样说:

  

您负责调用next()以运行链中的下一个处理程序。

他们所指的'链'是每条路线的处理链。通常,每个路由将由多个处理程序按特定顺序处理。链中的最后一个处理程序实际上不需要调用next() - 但是假设处理程序始终是最后一个处理程序是不安全的。在处理请求时,未能调用链中的所有处理程序可能会导致严重或细微的错误。

因此,作为良好的编程习惯,您的处理程序应始终调用next()[使用适当的参数]。

答案 1 :(得分:4)

另一个问题(当前)是,如果所有处理程序都不调用after,则不会发出服务器next事件。例如,如果您使用auditLogger使用after事件记录请求,则不会获得任何到达不会调用下一个处理程序的请求的日志。

我打开了一个PR to fix the issue,以便以任意方式发出after事件,但调用next是使用restify的应用的预期标准。