关于express.js中的next()函数的问题

时间:2019-04-22 12:55:43

标签: javascript node.js express

我无法绕过express.js中next()函数的概念。我想我的第一个问题是next()仅express.js函数吗?我的第二个问题是,在下面的示例中,下一步将做什么?控制台功能之后,转到下一个调用的功能?我很困惑。

emit

4 个答案:

答案 0 :(得分:4)

使用Express(和其他类似系统)时,每个请求都通过一系列中间件函数(例如您的cb0)传递。每个人都有机会对请求做些事情。

由于中间件功能所做的事情可能是异步的(例如,读取文件,查询数据库等),因此Express不能在调用上一个中间件之后直接直接调用下一个中间件。因此,它将中间件函数传递给函数next,该函数被中间件用来表示“我完成了,请继续下一步”。 (在Express版本中,您还可以将参数传递为Aikon Mogwai points outnext:如果将Error传递给"route",则会触发路由的错误处理。如果传递{ {1}},它跳到下一个路由器,等等。

因此next函数的概念不是Express特有的,但是该示例中的特定用途是

这是一个不使用Express的经过简化的示例,而是演示了在处理请求时它对中间件功能的处理方式:

const app = {
  middleware: [],
  use(callback) {
    this.middleware.push(callback);
  }
};

app.use((req, res, next) => {
  console.log("First handler synchronous part");
  setTimeout(() => {
    console.log("First handler async part finished");
    next();
  }, 800);
});

app.use((req, res, next) => {
  console.log("Second handler is entirely synchronous");
  next();
});

app.use((req, res, next) => {
  console.log("Third handler synchronous part");
  setTimeout(() => {
    console.log("Third handler async part finished");
    next();
  }, 800);
});

// Code handling an incoming request
function handleRequest(req, app) {
  // Copy the handlers
  const middleware = app.middleware.slice();
  // Create a "response"
  const res = {};
  // Call the handlers
  let index = 0;
  next();
  function next() {
    if (index < middleware.length) {
      // Call the handler, have it call `next` when it's done
      middleware[index++](req, res, next);
    } else {
      console.log("Request completed");
    }
  }
}

handleRequest({}, app);


可能值得一提的是,Koa.js中的promise已取代了这种手动样式的异步中间件处理方式,这是Express.js的开发者的新框架。使用Koa,您可以创建回调async函数,而Koa的内部人员会等待async函数返回的诺言稳定下来,然后根据其设置结果(例如,拒绝或实现,满足等等)。

答案 1 :(得分:2)

Next用于将控制权传递给下一个中间件功能。否则,请求将被挂起或打开。调用此函数将调用应用程序中的下一个中间件函数。 next()函数不是Node.js或Express API的一部分,而是传递给中间件函数的第三个参数。

答案 2 :(得分:1)

next()函数请求应用程序中的下一个中间件函数。 next()函数不是Node.js或Express API的一部分,但它是传递给中间件函数的第三种情况。 next()函数可以命名为任何名称,但按照惯例,它始终命名为“ next”。 为避免混淆,请始终使用此约定。

有关更多信息,您可以访问express的官方教程

答案 3 :(得分:1)

var express = require('express')
var app = express()

var CB0 = function (req, res, next) {
  console.log('CB0')
  next()
}

app.use(CB0)

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)

应用程序每次收到请求,并在终端窗口中显示消息“ CB0”控制台。

首先加载的中间件功能也将首先执行。

中间件函数CB0只是打印一条消息,然后通过调用next()函数将请求传递到堆栈中的下一个中间件函数。