在express
和connect
中,使用" next"在中间件中,如果我不需要它?有任何可能的负面结果吗?假设在此中间件之后没有中间件会被调用,因此next
不会调用任何东西。我知道它对于模块化是不好的,就好像你想为另一个中间件添加一个回调,它可能是由这个中间件中的next
意外触发的。但是,在这种情况下,next
无论如何都不利于模块化,因为中间件经常以意想不到的方式进行交互。
作为不需要的next
的示例,请考虑由最初提出堆栈名称的人构建的the sample MEAN.JS
stack。它似乎有一些next
回调,永远不会被调用。许多人都在the users
controller,包括signin
函数:
exports.signin = function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err || !user) {
res.status(400).send(info);
} else {
// Remove sensitive data before login
user.password = undefined;
user.salt = undefined;
req.login(user, function(err) {
if (err) {
res.status(400).send(err);
} else {
res.json(user);
}
});
}
})(req, res, next);
};
此函数定义了next
回调。然后,next
自定义中间件函数将此passport.authenticate()
回调用作参数。但是,此参数从不在函数本身中使用。我尝试从函数定义中取出next
定义,以及自定义passport
中间件,并且该路径似乎仍然有效。但是,也许passport
在其authenticate()
函数中使用它,并且将其删除不会在这里造成任何麻烦,但在某些情况下可能会造成麻烦。
我最近在http://passportjs.org上查看了passport
的教程,我在the authenticate
page上关于自定义回调的部分中遇到了一个看起来几乎与signin
中的MEAN.JS
功能。一个区别是它实际上有一些next
回调(用于错误处理),因此next
参数实际上是有用的。 MEAN.JS
应用程序是否有可能从passportjs.org
指南中获取了大量代码,并且随着时间的推移而改变了它,但留下了一些残留的遗留物,这些遗留物没有做任何事情但却没有造成任何伤害?或next
参数实际上在passport.authenticate()
中做了哪些事情并不是很明显?无论发生这种情况的原因如何, next
中间件中的额外connect
参数是否会导致任何不良副作用?
答案 0 :(得分:1)
编写中间件时,next
参数是可选的。它的目的是调用链中的下一个中间件。如果您希望当前的中间件是为给定请求调用的最后一个中间件,则不执行next
参数将实现该目的。这对于您自己编写的代码很好,但通常最好始终在中间件中执行next
参数,因为您不知道他们可能会添加什么。
例如,您可能希望添加在请求完成后发生的某种日志记录。如果在日志记录中间件之前运行的中间件没有执行next
,则不会记录它。
http://expressjs.com/api.html#middleware
不执行next
将无法启动下一个中间件。除了不移动到下一个中间件而导致的其他副作用没有其他副作用(例如,如果响应尚未结束,则不会调用next
将导致超时。)