Express中间件的原理及实现
在express中都是会用到中间件这个东西,下面模仿下express是如何实现中间件的
我们正常的写法都是
const express = require('express');
const app = express();
const xxx = require('xxx')
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.ues(xxx)
app.listen(3000);
只要用use就可以搞定了
如果说我们自己实现一个中间件就是下面这个样子的,官网也有中间件的介绍
const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
这里可以看到只要你运行了之后访问 localhost:3000控制台就会打印出 'LOGGED' 然后在网页中显示 Hello World!
下面我们模仿下原理
const http = require('http');
const express = () => {
let funcs = []; // 待执行的函数数组 形成了闭包
let app = function (req, res) {
let i = 0;
const next = () => {
let task = funcs[i++]; // 取出函数数组里的下一个函数
if (!task) { // 如果函数不存在,return
return;
}
task(req, res, next); // 否则,执行下一个函数
}
next();
}
// use方法就是把函数添加到函数数组中
app.use = function (task) {
funcs.push(task);
}
return app; // 返回实例
}
// 测试
let app = express();
http.createServer(app).listen('3000', function () {
console.log('listening 3000....');
});
const middleware1 = (req, res, next) => {
console.log('返回之前 middleware1');
next();
console.log('返回之后 middleware1');
}
const middleware2 = (req, res, next) => {
console.log('返回之前 middleware2');
next();
console.log('返回之后 middleware2');
}
const middleware3 = (req, res, next) => {
console.log('返回之前 middleware3');
next();
console.log('返回之后 middleware3');
}
app.use(middleware1);
app.use(middleware2);
app.use(middleware3);

浙公网安备 33010602011771号