如果我在express.js中省略next()怎么办?

时间:2017-10-10 12:20:24

标签: javascript node.js express

express.js文档声明如果next()从未在路线中被调用,那么

  

请求将被挂起

https://expressjs.com/en/guide/writing-middleware.html

这意味着什么?这是否意味着我应该使用next()完成每个请求,即使我已经调用res.send并且请求处理已完成?如果省略它会不会有内存泄漏或其他问题?

更新: 我确实把中间件与路由混淆了。我忘记了循环可以结束。但我不知道如何结束它。

5 个答案:

答案 0 :(得分:2)

这意味着什么?

这意味着请求/响应周期仍未完成。响应将不会发送到浏览器,浏览器将继续等待。

这是否意味着我应该用next()完成每个请求,即使我已经调用res.send并且请求处理已经完成了?

整句话是......

  

如果当前的中间件功能没有结束请求 - 响应周期,   它必须调用next()将控制权传递给下一个中间件函数。   否则,请求将被挂起。

因此,如果您打算在当前中间件中结束循环,则可以在没有next()的情况下调用res.send,res.end或res.json。但如果您打算转到下一个中​​间件,则应该调用next(),否则它将无法转到下一个中​​间件。

如果我省略了内存泄漏或其他问题,

如果请求/响应周期未完成,则不会返回分配给该周期的内存,这意味着内存泄漏。

答案 1 :(得分:1)

我认为它不会导致任何内存泄漏我们也会使用next()来调用下一个middleware就像假设您有两件事要做,首先验证用户然后发送数据对于该请求,您现在要做的是首先在一个中间件中进行身份验证,然后在用户成功验证该请求时调用next,否则不会。

答案 2 :(得分:1)

nextcallback函数本质上是用信号通知事件循环发射器当前函数已完成处理的方式。您可以将数据作为参数传递给下一个函数。

如果您不调用callbacknext函数,则永远不会执行事件循环中下一个函数。 Express在处理请求后必须具有某些功能链。因此,跳过调用回调函数本身绝对不是一个好习惯。

答案 3 :(得分:1)

当你想将控件传递给链中的下一个中间件(例如处理错误的通用中间件)时,会调用

next()

由于中间件的订单声明是相关的,express只会负责验证函数的参数,如果它找到第三个参数,那么它会将指针传递给后续的中间件。

如果您将结果返回给客户端(例如,呼叫res.send()),您不需要调用next(),因为请求已经结束。

//this is an example of a hanging request since you're not calling 
//niether next nor res.send() 
router.get('/myRoute', (req, res, next) => {
  //do nothing
})

答案 4 :(得分:1)

没有内存泄漏,如果没有更多的中间件要运行(next()之后),则不想调用res.send()next()是cb函数的占位符。这就是中间件,顺序调用的一个或多个函数,直到到达请求 - 响应周期的末尾。在这个例子中,当我们点击login端点时,我们将运行2个中间件:{{1} }和validate,然后我们调用changeStuff函数,结束请求 - 响应周期。

returnResponse