89 # express 构建 layer 和 route 的关系

上一节实现了实现应用和路由的分离,这一节来构建 layer 和 route 的关系

先看个例子如下:路由中间件,将处理的逻辑拆分成一个个的模块

const express = require("express");
const app = express();

app.get(
    "/",
    (req, res, next) => {
    
    
        console.log(1);
        next();
    },
    (req, res, next) => {
    
    
        console.log(11);
        next();
    },
    (req, res, next) => {
    
    
        console.log(111);
        next();
    }
);

app.get("/", (req, res, next) => {
    
    
    console.log(2);
    res.end("end");
});

app.listen(3000, () => {
    
    
    console.log(`server start 3000`);
    console.log(`在线访问地址:http://localhost:3000/`);
});

在这里插入图片描述
执行过程示意图:

在这里插入图片描述

实现示意图:

在这里插入图片描述

下面新建 layer.jsroute.js 的文件

在这里插入图片描述

layer.js

function Layer(path, handler) {
    
    
    this.path = path;
    this.handler = handler;
}

module.exports = Layer;

route.js

const Layer = require("./layer");

function Route() {
    
    
    this.stack = [];
}

Route.prototype.dispatch = function () {
    
    
    // 稍后调用此方法时,回去栈中拿出对应的 handler 依次执行
};

Route.prototype.get = function (handlers) {
    
    
    handlers.forEach((handler) => {
    
    
        // 这里的路径没有意义
        let layer = new Layer("/", handler);
        layer.method = "get";
        this.stack.push(layer);
    });
};

module.exports = Route;

router/index.js

const Route = require("./route");
const Layer = require("./layer");

function Router() {
    
    
    // 维护所有的路由
    this.stack = [];
}

Router.prototype.route = function (path) {
    
    
    // 产生 route
    let route = new Route();
    // 产生 layer 让 layer 跟 route 进行关联
    let layer = new Layer(path, route.dispatch.bind(route));
    // 每个路由都具备一个 route 属性,稍后路径匹配到后会调用 route 中的每一层
    layer.route = route;
    // 把 layer 放到路由的栈中
    this.stack.push(layer);
    return route;
};

// 用户调用 get 时,传入的 handler 不一定是一个
Router.prototype.get = function (path, ...handlers) {
    
    
    // 1.用户调用 get 时,需要保存成一个 layer 当道栈中
    // 2.产生一个 Route 实例和当前的 layer 创造关系
    // 3.要将 route 的 dispatch 方法存到 layer 上
    let route = this.route(path);
    // 让 route 记录用户传入的 handler 并且标记这个 handler 是什么方法
    route.get(handlers);
};

Router.prototype.handle = function (req, res, next) {
    
    };

module.exports = Router;

猜你喜欢

转载自blog.csdn.net/kaimo313/article/details/132960962