2017-10-10 64 views
2

的express.js文档指出,如果next()永远不会在路线称为然后如果我在express.js中忽略next()会怎么样?

请求将被留下挂

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

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

更新: 我的确让中间件与路线混淆了。我忘记了这个循环可以结束。但我不知道如何结束它。

+0

它对**中间件**这么说,但你在问路由。你确定你正在阅读文档的正确部分吗?你知道中间件是什么吗? – Mjh

+0

发布您的代码以更好地解释问题 –

回答

2

这是什么意思?

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

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

整个句子是...

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

所以,如果你打算在目前的中间件内结束循环,你可以在没有next()的情况下调用res.send,res.end或res.json。但是如果你打算去下一个中间件,你应该调用next(),否则它不会去下一个中间件。

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

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

1

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

1

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

如果您不调用callbacknext函数,那么事件循环中接下来的函数将永远不会执行。 Express处理请求后必须具有某些功能链。所以,绝对不是跳过调用回调函数本身的好习惯。当你想通过控制链中的下一个中间件(如通用中间件来处理错误)

因为中间件的顺序声明相关

1

next()被调用时,表示只会照顾验证函数的参数,如果它找到第三个参数,那么它会传递一个指向后续中间件的指针。

如果您将结果返回给客户端(例如,调用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 
}) 
1

没有内存泄漏,而你不想打电话next()如果没有更多的中间件(res.send()后)运行。 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) 
} 
相关问题