繁体   English   中英

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

[英]What if I omit next() in express.js?

express.js文档指出,如果从未在路由中调用next() ,则

该请求将被挂起

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

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

更新:我确实已经将中间件与路由混淆了。 我忘记了循环可以结束。 但是我不确定如何结束它。

这意味着什么?

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

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

整个句子是...

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

因此,如果您打算在当前中间件中结束循环,则可以不使用next()即可调用res.send,res.end或res.json。 但是,如果您打算转到下一个中​​间件,则应调用next(),否则它将不会转到下一个中​​间件。

如果我忽略它,会不会出现内存泄漏或其他问题?

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

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

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

如果您不调用callback函数或next函数,则事件循环中的下next函数将永远不会执行。 Express在处理请求后必须具有某些功能链。 因此,绝对不要跳过回调函数本身。

当您要将控件传递给链中的下一个中间件时(例如,用于处理错误的通用中间件next()将调用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
})

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

get('/login',
validate,
changeStuff,
returnResponse
);

function validate(req, res, next) {
//validate logic does something then calls next()

next()
//just like calling changeStuff(req, res, next)
}

function changeStuff(req, res, next) {
//changeStuff logic changes something then calls next()

next()
//just like calling returnResponse(req, res, next)
}

function returnResponse(req, res) {
//will return something and that is the end of the req-res cycle
//there are no more functions to call, if you try to call next()
//you would get an error, because at this point next() would be 
//undefined

res.send(req.body)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM