89 # express 构建 layer 和 route 的关系

简介: 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;
目录
相关文章
|
5天前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express构建RESTful API
使用Node.js和Express构建RESTful API
29 0
express学习5-构建模块化路由2
express学习5-构建模块化路由2
62 0
express学习5-构建模块化路由2
express学习4-构建模块化路由
express学习4-构建模块化路由
58 0
express学习4-构建模块化路由
|
资源调度 Kubernetes JavaScript
使用Yarn workspace,TypeScript,esbuild,React和Express构建 K8S 云原生应用(一)
使用Yarn workspace,TypeScript,esbuild,React和Express构建 K8S 云原生应用(一)
253 0
|
中间件
Express app.get 进行路由 Route 设置
Basic routing 路由是指确定应用程序如何响应客户端对特定端点的请求,即 URI(或路径)和特定的 HTTP 请求方法(GET、POST 等)。 每个路由可以有一个或多个处理函数,当路由匹配时执行。
|
中间件
Express app.get 进行路由 Route 设置
Express app.get 进行路由 Route 设置
110 0
Express app.get 进行路由 Route 设置
|
监控 大数据 数据库
使用SAP HANA Express Edition开始用自己的设备构建大数据应用
作为SAP HANA Platform的简化版本,开发者可以免费下载使用SAP HANA Express Edition,用最简单的硬件设备(包括个人电脑、服务器与云服务器)运行SAP HANA Express Edition。快捷简单的构建大数据与企业服务解决方案,并进行快速部署。
6633 0
|
Web App开发 JavaScript 前端开发
nodeJS(express4.x)+vue(vue-cli)构建前后端分离详细教程(带跨域)
好想再回到大学宿舍,当时床虽小,房随小,但是心确是满的 ----致  西安工程大学a-114舍友们 转载请注明出处:水车:http://www.cnblogs.com/xuange306/p/6185453.
2275 0
|
JavaScript 前端开发 HTML5
Feathers JS – 基于 Express 构建数据驱动的服务
  Feathers 是一个轻量的 Web 应用程序框架,基于 NodeJS 最流行​​的 Web 框架——Express。这使得它很容易使用 socket.io 来创建 RESTful Web 服务和实时应用。
1194 0