关于expressjs中的next()函数的问题

noo*_*iam 3 javascript node.js express

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

var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

对于 Express(和其他类似的系统),每个请求都会通过一系列中间件功能(例如您的cb0)。他们每个人都有机会根据请求做一些事情。

由于中间件函数所做的事情可能是异步的(例如,读取文件、查询数据库等),因此 Express 不能在调用前一个中间件后直接调用下一个中间件。因此,它向中间件函数传递一个函数 ,next中间件用它来表示“我完成了,运行下一步”。(在 Express 版本中,您还可以向 传递一个参数next,正如Aikon Mogwai 指出的那样:如果您向它传递一个Error,它会触发路由的错误处理。如果您传递它"route",它会跳转到下一个路由器,等等)。

因此,函数的概念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);
Run Code Online (Sandbox Code Playgroud)


可能值得一提的是,这种手动式的异步中间件处理已被Koa.js中的 Promise 所取代,Koa.js 是一个新的框架,由制作 Express.js 的同一个人开发。使用 Koa,您可以创建回调async函数,Koa 的内部等待函数async返回的 Promise 稳定下来,然后对其设置的结果进行操作(例如,拒绝或实现、它实现的值等)。