我无法绕过express.js中next()函数的概念。我想我的第一个问题是next()仅express.js函数吗?我的第二个问题是,在下面的示例中,下一步将做什么?控制台功能之后,转到下一个调用的功能?我很困惑。
emit
答案 0 :(得分:4)
使用Express(和其他类似系统)时,每个请求都通过一系列中间件函数(例如您的cb0
)传递。每个人都有机会对请求做些事情。
由于中间件功能所做的事情可能是异步的(例如,读取文件,查询数据库等),因此Express不能在调用上一个中间件之后直接直接调用下一个中间件。因此,它将中间件函数传递给函数next
,该函数被中间件用来表示“我完成了,请继续下一步”。 (在Express版本中,您还可以将参数传递为Aikon Mogwai points out到next
:如果将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()函数将请求传递到堆栈中的下一个中间件函数。