【问题标题】:What's the point of calling next() after res.send() in Resitfy?在 Resitfy 中 res.send() 之后调用 next() 有什么意义?
【发布时间】:2016-10-12 01:55:07
【问题描述】:

我熟悉 Express,但对 Restify 不熟悉。 Restify 的文档中有很多在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() 之后,链中的下一个处理程序可以做什么?

【问题讨论】:

  • 嗯,当然,它可能会做额外的数据库工作或请求跟踪等,但是......如果你不做这些,你为什么要调用.next?这样做将允许您添加的未来处理程序无需返回即可工作,并且由于调用 .next 并没有真正的危害,您不妨只知道如果多个路由碰巧匹配同一个请求,则只有其中一个可以成功调用res.send,第二个会报错。
  • @Kevin B:感谢您的回答。 'post-render' 类型的中间件就是这种情况,对吧?请在下面阅读我的意见,让我知道您的想法。
  • 正确。我同意你的结论,只有在你知道自己在做什么的情况下才这样做。

标签: node.js restify


【解决方案1】:

在我做了更多研究之后,我想我找到了答案。

res.send() 之后调用next() 的唯一实际用例是当您想要安装“后渲染”类型的中间件以在路由处理程序完成工作后捕获所有事务。

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

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

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

【讨论】:

  • 感谢您的见解-我认为应该指出的是,特别是如果您使用任何计时或日志记录行为,那么您可能总是需要调用next() send() 之后 - 性能开销与否。因此,如果您是阅读本文的图书馆作者。请保持礼貌并致电 next(),这样您就不会在他人导入您的模块时无意中破坏他们的应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
相关资源
最近更新 更多