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

 

posted @ 2020-08-08 23:42  GQiangQ  阅读(403)  评论(0编辑  收藏  举报