【nodejs原理&源码赏析(1)】Express中间件系统的基本实现
一直觉得express
的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品。今天就来实现一个简易的【中间件队列】。
一. API层
-
初始化方法
let middleware = new MiddleWare();
-
添加中间件函数的方法
//Fn为被添加的中间件middleware.use(Fn);
-
启动中间件队列
middleware.start(req, res);
二. 核心类的定义
class MiddleWare{ constructor(){ this.queue = [];//用来存放中间件队列
} //添加中间件
use(fn){ this.queue.push(fn);//将自定义中间件加入队列
} //按次序执行中间件
start(req, res){ let i = 0;//执行指针
//执行器
const next = (err)=>{ //如果有错误就将错误信息挂在response上并直接退出
if(err){
res.hasError = true;
res.data = err.toString(); return;
} //如果没有错误就查看是否到达队尾,若没到则继续执行下一个中间件
if(i < this.queue.length){ this.queue[i++](req, res, next); /*将next直接传入当前执行的函数作为回调
当前执行函数执行到任何一步,通过主动调用next方法即可将相关信息传给下一个中间件。*/
}else{ //如果已经到队尾了则结束
console.log('finish');
}
} //启动第一个
next();
}
}
三. 使用use方法添加中间件
//添加第一个中间件/*
此处演示了一个基本的错误捕捉的写法,当中间件中出现错误时,会捕捉到错误并传入next
*/middleware.use(function(req, res, next){ try{
req.addon1 = 'I add something';
}catch(err){
next(err);
}
next();
});//添加第二个中间件middleware.use(function(req, res, next){
res.addon2 = 'I add something more';
next();
});//添加第三个中间件middleware.use(function(req, res, next){ if (req.addon2) { delete req.addon2;
}
res.addon3 = 'I add something a lot';
next();
});
四. 消费定义的类
“消费”这个词是最近学到的,觉得很装X,所以也在这里装一下~
let req = {};let res = {};let result = middleware.start(req,res);console.log(req, res);
五. 查看运行结果
可以看到有错误发生和正常响应时的不同结果:
六. 在服务器端运行
用node
起一个web服务器那真是太随意了~
const http = require('http');//上面的一堆代码http.createServer(function(req, res){ let result = {};
middleware.start(req, result);
res.end(JSON.stringify(result));
}).listen(9527);
看一下效果(访问服务器时自定义消息就可以传至前台了):
作者:大史不说话
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南