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

Javascript 关于expressjs中的next()函数的问题,javascript,node.js,express,Javascript,Node.js,Express,我很难理解express.js中next()函数的概念。我想我的第一个问题是next()是一个只包含express.js的函数吗?我的第二个问题是,在下面的例子中,下一步做什么?在console函数之后,它转到在之后调用的下一个函数?我很困惑 var cb0 = function (req, res, next) { console.log('CB0'); next(); } Next用于将控制传递给下一个中间件函数。如果没有,请求将挂起或打开。调用此函数将调用应用程序中的下一个中间件

我很难理解express.js中next()函数的概念。我想我的第一个问题是next()是一个只包含express.js的函数吗?我的第二个问题是,在下面的例子中,下一步做什么?在console函数之后,它转到在之后调用的下一个函数?我很困惑

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

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

对于Express(和其他类似系统),每个请求都通过一系列中间件函数(如
cb0
)。每个人都有机会处理请求

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

因此,
next
函数的概念并不是专门用来表达的,但该示例中的具体用法是

下面是一个非常简化的示例,不使用Express,但演示了它在处理请求时使用中间件功能所做的事情:

const应用={
中间件:[],
使用(回调){
this.middleware.push(回调);
}
};
应用程序使用((请求、恢复、下一步)=>{
log(“第一个处理程序同步部分”);
设置超时(()=>{
log(“第一个处理程序异步部分完成”);
next();
}, 800);
});
应用程序使用((请求、恢复、下一步)=>{
log(“第二个处理程序完全同步”);
next();
});
应用程序使用((请求、恢复、下一步)=>{
log(“第三处理程序同步部分”);
设置超时(()=>{
log(“第三个处理程序异步部分完成”);
next();
}, 800);
});
//处理传入请求的代码
函数handleRequest(请求、应用){
//复制处理程序
const middleware=app.middleware.slice();
//创建“响应”
常数res={};
//呼叫处理程序
设指数=0;
next();
函数next(){
if(索引<0.length){
//调用处理程序,让它在完成后调用'next'
中间件[index++](req、res、next);
}否则{
控制台日志(“请求完成”);
}
}
}
HandlerRequest({},app)
函数
next()
请求应用程序中的下一个中间件函数。
next()
函数不是Node.js或Express API的一部分,但它是传递给中间件函数的第三种情况/参数。
next()
函数可以被命名为任何名称,但按照惯例,它总是被命名为“next”为避免混淆,请始终使用此约定。

有关更多信息,请访问的官方教程

每次应用程序收到请求并在终端窗口中打印消息“CB0”控制台时

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

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

是next()仅用于expressjs的函数吗?
-否,任何javascript代码都可以有一个名为
next
的函数。。。但是
next
只是express中第三个参数的“常规”名称-如果编写
var cb0=function(req,res,frank){console.log('cb0')frank()
-阅读此内容了解此回调的用法如果没有,请求将挂起或打开-只是没有响应。next()函数不是Node.js或Express API的一部分-它是Express API的一部分,因为Express调用中间件函数并为其提供
next
参数。另外:
next(err)
等于中间件中的
throw err;
,可以使用
next('route')
跳转到下一个路由器。
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)