88 # express 应用和路由的分离

上一节实现了应用和创建应用的分离,这一节来实现应用和路由的分离

application.js

const http = require("http");
const Router = require("./router");

function Application() {
    
    
    this._router = new Router();
}

Application.prototype.get = function (path, handler) {
    
    
    this._router.get(path, handler);
};

Application.prototype.listen = function () {
    
    
    const server = http.createServer((req, res) => {
    
    
        function next() {
    
    
            res.end(`kaimo-express Cannot ${
      
      req.method} ${
      
      req.url}`);
        }
        this._router.handle(req, res, next);
    });
    server.listen(...arguments);
};

module.exports = Application;

然后我们新建 router 文件夹,里面添加 index.js,添加代码

在这里插入图片描述

const url = require("url");

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

Router.prototype.get = function (path, handler) {
    
    
    this.stack.push({
    
    
        path,
        method: "get",
        handler
    });
};

Router.prototype.handle = function (req, res, next) {
    
    
    const {
    
     pathname } = url.parse(req.url);
    const requestMethod = req.method.toLowerCase();
    for (let i = 0; i < this.stack.length; i++) {
    
    
        let {
    
     path, method, handler } = this.stack[i];
        if (path === pathname && method === requestMethod) {
    
    
            return handler(req, res);
        }
    }
    // 处理不了的直接走 next
    next();
};

module.exports = Router;

启动测试代码:

const express = require("./kaimo-express");
const app = express();

// 调用回调时 会将原生的 req 和 res 传入(req,res 在内部也被扩展了)
// 内部不会将回调函数包装成 promise
app.get("/", (req, res) => {
    
    
    res.end("ok");
});

app.get("/add", (req, res) => {
    
    
    res.end("add");
});

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kaimo313/article/details/132959187
88
今日推荐