打算自己写一个简单的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} =ctxconst 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);