首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时在Node.js中使用next()并返回next()

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

Stack Overflow用户
提问于 2013-05-29 17:39:16
回答 7查看 92.4K关注 0票数 164

Scenario:考虑以下来自节点web应用程序的代码部分。

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

Issue:我正在检查只使用next()还是return next()的版本。上面的示例代码在这两种情况下的工作方式完全相同,没有显示出任何执行上的差异。

Question:有人能说明一下这个问题吗?什么时候使用next(),什么时候使用return next()以及一些重要的区别?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-05-29 18:53:14

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

如果您不这样做,您可能会在稍后再次触发回调,这通常会产生破坏性的结果。您的代码没有问题,但我会将其重写为:

代码语言:javascript
复制
app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;

    if(!id)
        return next();

    // do something
});

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

票数 182
EN

Stack Overflow用户

发布于 2017-04-14 10:01:22

正如@Laurent Perrin的回答:

如果您不这样做,您可能会在稍后再次触发回调,这通常会产生破坏性的结果

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

代码语言:javascript
复制
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()
})

您会发现控制台中的输出为:

代码语言:javascript
复制
This is a middleware
This is second middleware
This is third middleware
This is first-half middleware

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

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

票数 257
EN

Stack Overflow用户

发布于 2013-05-29 19:01:30

next()connect middleware的一部分。路由流的回调并不关心您是否从函数中返回任何内容,因此return next()next(); return;基本上是相同的。

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

代码语言:javascript
复制
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()在很大程度上用于扩展请求的中间件。

票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16810449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档