compose
2023年05月31日
一、认识
二、源码
三、实现
function compose(req,res,middleware) {
let index = 0;
function next(error) {
if (index >= middleware.length) {
console.log("error", error);
return;
}
while (index < middleware.length) {
const fn = middleware[index++];
fn(req, res, next);
}
}
next();
}
next
不断取出 middleware
中的中间件进行调用, 同时把 next
本身传递给 中间件 作为第三个参数。每个中间件约定的固定形式为 (req, res, next) => {}
, 这样每个**中间件*函数中只要调用 next 方法即可传递调用下一个中间件。
express
的中间件是一个 尾递归调用, 之所以说是尾递归是因为递归函数的最后一条语句是调用函数本身,所以每一个中间件的最后一条语句需要是**next()
才能形成尾递归**,否则就是普通递归,尾递归相对于普通”递归“的好处在于节省内存空间,不会形成深度嵌套的函数调用栈。
四、调试
function middleware1(req, res, next) {
req.message = "aaa";
next();
console.log(req.message);
}
function middleware2(req, res, next) {
req.message += "bbb";
next();
}
function middleware3(req, res, next) {
req.message += "ccc";
}
const req = {};
const res = {};
const middleware = [middleware1, middleware2, middleware3];
compose(req, res, middleware);