【问题标题】:The consequences of not calling next() in restify在 restify 中不调用 next() 的后果
【发布时间】:2014-04-16 18:49:03
【问题描述】:

我已经使用 Restify 有一段时间了。我遇到了一些缺少next() 的代码,我突然想到我是否完全理解为什么应该在res.send() 之后调用next() 的原因。我明白为什么要在中间件情况下使用它,但对于正常路线,为什么需要它?例如:

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

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

如果return next(); 被排除在代码之外,它似乎不会导致错误,并且可以根据我所看到的内容运行。

【问题讨论】:

    标签: node.js restify


    【解决方案1】:

    restify API Guide 有话要说:

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

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

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

    【讨论】:

    • 有道理。那么,next() 正在处理如何处理路由的顺序?所有路线仍将被处理,但可能不是按照脚本中指示的顺序?
    • @Stockholmux 路由仍然会以正确的顺序相互处理。但是,任何使用不调用 next() 的处理程序的路由可能不会被完全处理。每条路由都有自己的处理程序链。例如,每当您调用 restify.use() 时,您都会将处理程序逐步添加到每个路由的链中。并且处理程序是按照您的代码在运行时定义的顺序添加的。因此,没有处理程序可以确定它总是在使用它的每个路由中调用的最后一个。
    • 啊 - 有道理,尤其是 .use() - 我没有考虑中间件的角度。
    【解决方案2】:

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

    我已经打开了一个PR to fix the issue 以便以任一方式发出after 事件,但调用next 是使用restify 的应用程序的预期规范。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-22
      • 2015-01-27
      • 1970-01-01
      • 2019-08-27
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多