koa --- > 自制简易的koa-router

26 篇文章 1 订阅

打算自己写一个简单的Router类,来实现koa-router这个中间件的(部分)神奇功能

确定需求

1.首先导入需要在app.js里面导入自己写的Router类
2.然后是使用的方式和挂载router的方式

// 导入Router类
const Router = require('./components/router.js');

// 使用方式,(暂时只对get请求做处理)
const router = new Router();
router.get('/404',(ctx, next) => {
    ctx.body = 'Page not found';
    ctx.status = 404;
})
app.use(router.routes());

设计

  • 以上只是部分代码,在本篇的结尾会贴出整体代码.
  • 上面设计到Router实例(router)的2个方法:get和routes.
  • get():接受了2个参数,一个是需要处理的url,一个是对应路由的路由事件处理函数.该方法,将处理的路由和路由处理事件存入一个数组中,因此需要一个_routes的私有数组
  • routes():app.use里面接受的是一个async函数,因此在routes方法中,需要返回一个async函数,当收到来自客户端的url请求后(url的信息被存储在ctx中),需要根据请求方法和url地址,找到_routes中对应的处理函数,然后等待执行. await…

实现

// router.js
class Router{
    constructor() {
        this._routes = [];
    }
    get(url, hanlder) {
        this._routes.push({
            url: url,
            method:'GET',
            handler
        });
    }
    routes() {
        return async (ctx, next) {
            const { method, url} =ctx
            const matchedRouter = this._routes.find(r => r.method === method && r.url === url);
            if(matchedRouter && matchedRouter.handler(context, next){
                await matchedRouter.handler(ctx, next);
            } else {
                awai next();
            }
        }
    }
}
module.exports = Router;

补充

完整的app.js

const koa = require('koa');
const app = new koa()
const Router = require('./components/router.js');
const router = new Router();

router.get('/404', (ctx, next) => {
    ctx.body = 'Page not found';
    ctx.status = 404;
});
app
    .use(router.routes())
    .listen(3000);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值