何时使用next()并在Node.js中返回next()

问题描述 投票:93回答:3

场景:考虑以下是节点Web应用程序的代码部分。

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;
    if (id) {
        // do something
    } else {
        next(); //or return next();
    }
});

问题:我正在检查哪一个只用next()return next()。上面的示例代码对两者都完全相同,并且没有显示执行上的任何差异。

问题:有人可以对此有所了解,何时使用next()以及何时使用return next()和一些重要区别?

node.js express connect v8
3个回答
103
投票

有些人总是写return next()是为了确保在触发回调后执行停止。

如果你不这样做,你就有可能在第二次触发回调,这通常会产生毁灭性的结果。你的代码很好,但我会把它重写为:

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;

    if(!id)
        return next();

    // do something
});

它为我节省了缩进级别,当我稍后再次阅读代码时,我确信next没有被调用两次。


100
投票

正如@Laurent Perrin的回答:

如果你不这样做,你就有可能在第二次触发回调,这通常会产生毁灭性的结果

如果你像这样编写中间件,我在这里给出一个例子:

app.use((req, res, next) => {
  console.log('This is a middleware')
  next()
  console.log('This is first-half middleware')
})

app.use((req, res, next) => {
  console.log('This is second middleware')
  next()
})

app.use((req, res, next) => {
  console.log('This is third middleware')
  next()
})

你会发现控制台中的输出是:

This is a middleware
This is second middleware
This is third middleware
This is first-half middleware

也就是说,它在所有中间件功能完成后运行next()下面的代码。

但是,如果你使用return next(),它会立即跳出回调,并且回调中的return next()下面的代码将无法访问。


42
投票

next()connect middleware的一部分。路由器流程的回调并不关心你从函数返回任何东西,所以return next()next(); return;基本相同。

如果您想要停止功能流,您可以使用next(err),如下所示

app.get('/user/:id?', 
    function(req, res, next) { 
        console.log('function one');
        if ( !req.params.id ) 
            next('No ID'); // This will return error
        else   
            next(); // This will continue to function 2
    },
    function(req, res) { 
        console.log('function two'); 
    }
);

几乎next()用于扩展您的请求的中间件。

© www.soinside.com 2019 - 2024. All rights reserved.