跳到主要内容

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);