90 # 实现 express 请求处理

简介: 90 # 实现 express 请求处理

上一节构建 layer 和 route 的关系,这一节来实现 express 请求处理

application.js

const http = require("http");
const Router = require("./router");
function Application() {
    this._router = new Router();
}
Application.prototype.get = function (path, ...handlers) {
    this._router.get(path, handlers);
};
Application.prototype.listen = function () {
    const server = http.createServer((req, res) => {
        function done() {
            res.end(`kaimo-express Cannot ${req.method} ${req.url}`);
        }
        this._router.handle(req, res, done);
    });
    server.listen(...arguments);
};
module.exports = Application;

router/index.js

const url = require("url");
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, out) {
    console.log("请求到了");
    // 需要取出路由系统中 Router 存放的 layer 依次执行
    const { pathname } = url.parse(req.url);
    let idx = 0;
    let next = () => {
        // 遍历完后没有找到就直接走出路由系统
        if (idx >= this.stack.length) return out();
        let layer = this.stack[idx++];
        // 需要判断 layer 上的 path 和当前请求路由是否一致,一致就执行 dispatch 方法
        if (layer.path === pathname) {
            // 将遍历路由系统中下一层的方法传入
            layer.handler(req, res, next);
        } else {
            next();
        }
    };
    next();
};
module.exports = Router;

route.js

const Layer = require("./layer");
function Route() {
    this.stack = [];
}
Route.prototype.dispatch = function (req, res, out) {
    // 稍后调用此方法时,回去栈中拿出对应的 handler 依次执行
    let idx = 0;
    console.log("this.stack----->", this.stack);
    let next = () => {
        // 遍历完后没有找到就直接走出路由系统
        if (idx >= this.stack.length) return out();
        let layer = this.stack[idx++];
        if (layer.method === req.method.toLowerCase()) {
            layer.handler(req, res, next);
        } else {
            next();
        }
    };
    next();
};
Route.prototype.get = function (handlers) {
    console.log("handlers----->", handlers);
    handlers.forEach((handler) => {
        // 这里的路径没有意义
        let layer = new Layer("/", handler);
        layer.method = "get";
        this.stack.push(layer);
    });
};
module.exports = Route;

测试 demo 如下

const express = require("./kaimo-express");
const app = express();
app.get(
    "/",
    (req, res, next) => {
        console.log(1);
        setTimeout(() => {
            next();
        }, 1000);
    },
    (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/`);
});

目录
相关文章
|
2月前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
138 11
|
6月前
|
JSON 中间件 API
在 Express.js 中处理 GET 请求
在 Express.js 中处理 GET 请求
|
11月前
【Express】—Express路由请求
【Express】—Express路由请求
|
存储 开发框架 中间件
node-09-express-请求
express模块,node里对http模块的再次封装 官方定义 Express是一个自身功能极简的,完全是由 路由和中间件 构成的一个web开发框架. 通俗理解 express应用就是在调用各种中间
115 0
|
前端开发
express搭建后端请求路由,前端进行访问对应的接口 后端解决跨域
express搭建后端请求路由,前端进行访问对应的接口 后端解决跨域
|
JSON 中间件 API
Express_02--处理表单的POST请求
Express_02--处理表单的POST请求
160 0
|
监控 JavaScript 前端开发
Fundebug后端Node.js插件更新至0.2.0,支持监控Express慢请求
摘要: 性能问题也是BUG,也需要监控。 Fundebug后端Node.js异常监控服务 Fundebug是专业的应用异常监控平台,我们Node.js插件fundebug-nodejs可以提供全方位的异常监控,支持Express、Koa以及Hapi框架。
1150 0
|
前端开发
express响应前端ajax请求
后端其实并不需要知道前端发起的请求是不是ajax,后端只需要响应请求即可.例子: 前端这样写: $('button').on('click', function(event) { event.
940 0
|
29天前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
1月前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用