【问题标题】:Nodejs next function, why? [duplicate]Nodejs下一个函数,为什么? [复制]
【发布时间】:2017-01-06 08:28:09
【问题描述】:

我正在使用 nodejs 开发 api。我看到有一个参数通过req, res 像这样在函数中传递:

bookRouter.use('/:bookId', function(req,res,next){
        Book.findById(req.params.bookId, function(err,book){
            if(err)
                res.status(500).send(err);
            else if(book)
            {
                req.book = book;
                next();
            }
            else
            {
                res.status(404).send('no book found');
            }
        });
    });

我从来没有在我的开发中使用过这个功能,我想知道我是否真的需要使用这个功能?

【问题讨论】:

  • 这就是 express 框架的工作方式(顺便说一下,req,res 是内置 http 库的工作方式 - express 使他们的 API 与 http 库兼容)。如果您不想使用 express,则不需要它。如果您不想创建网站,那么您甚至不需要 req 和 res 的东西。

标签: node.js express


【解决方案1】:

来自文档:

您可以提供多个类似于中间件的回调函数来处理请求。唯一的例外是这些回调可能会调用 next('route') 来绕过剩余的路由回调。您可以使用此机制对路线施加先决条件,然后如果没有理由继续当前路线,则将控制权传递给后续路线。

单个回调函数可以处理路由。例如:

app.get('/example/a', function (req, res) {
  res.send('Hello from A!');
});

多个回调函数可以处理一个路由(确保指定下一个对象)。例如:

app.get('/example/b', function (req, res, next) {
  console.log('the response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from B!');
});

【讨论】:

  • 当我第一次看到这个时,想到的问题是“为什么要为单个路由/端点提供多个回调函数?” ...但是从那以后我就考虑过了...也许您想在处理所有路由时运行相同的功能,然后单独处理每条路由。所以 3 个路由会有回调 [common_cb, route1_cb], [common_cb, route2_cb] 和 [common_cb, route3_cb]。但是后来我想……这真的和中间件没有什么不同,对吧?在考虑了更多之后,我得出结论,这只是控制服务器功能的两种不同方式。
【解决方案2】:

我在 node.js 方面不是那么强,但目的是在找到具有给定 ID 的书时调用一个函数。要调用的函数作为next 传入。可能还涉及到其他中间件组件,所以调用next()确保这部分成功后,下一个中间件可以处理请求。

【讨论】:

    【解决方案3】:

    next 函数将调用堆栈中的下一个中间件函数。详情请见https://expressjs.com/en/guide/using-middleware.html

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      您不必使用next(),因为您的操作是处理请求的最后一个操作。这是documentation 片段:

      中间件函数是可以访问请求对象 (req)、响应对象 (res) 和应用程序请求-响应周期中的下一个中间件函数的函数。 next 中间件函数通常由一个名为 next 的变量表示。

      中间件函数可以执行以下任务:

      1. 执行任何代码。
      2. 更改请求和响应对象。
      3. 结束请求-响应周期。
      4. 调用堆栈中的下一个中间件函数。

      如果当前中间件函数没有结束请求-响应循环,它必须调用 next() 将控制权传递给下一个中间件函数。否则,请求将被挂起。

      【讨论】:

      • 这不是最后一个。如您所见,它设置了req.book,但不发回响应。
      • 啊,是的。同意。然后调用next() 会将控制权传递给下一个中间件。
      【解决方案5】:

      Node 是带有回调的基于事件的语言。如果您的事件成功触发并且您想要执行某个函数,那么它将作为参数传递给 this。但是,如果您不传递函数或不使用它,它不会产生问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-30
        • 2013-04-18
        • 2019-11-05
        • 2010-12-20
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2018-11-07
        相关资源
        最近更新 更多