如果我不需要它,接下来会不好用吗?

时间:2014-11-05 20:27:58

标签: node.js express middleware

expressconnect中,使用" 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参数是否会导致任何不良副作用?

1 个答案:

答案 0 :(得分:1)

编写中间件时,next参数是可选的。它的目的是调用链中的下一个中间件。如果您希望当前的中间件是为给定请求调用的最后一个中间件,则不执行next参数将实现该目的。这对于您自己编写的代码很好,但通常最好始终在中间件中执行next参数,因为您不知道他们可能会添加什么。

例如,您可能希望添加在请求完成后发生的某种日志记录。如果在日志记录中间件之前运行的中间件没有执行next,则不会记录它。

http://expressjs.com/api.html#middleware

不执行next将无法启动下一个中间件。除了不移动到下一个中​​间件而导致的其他副作用没有其他副作用(例如,如果响应尚未结束,则不会调用next将导致超时。)