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)
对于 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 稳定下来,然后对其设置的结果进行操作(例如,拒绝或实现、它实现的值等)。
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |