我们在《 koa第四章:URL中间件koa-router和koa-bodyparser用法 》 使用了不少 router.get 、router.post 的操作方法,很明显一多就乱,这还是在没有加入其他常规业务处理逻辑的情况下。
所以,最好不要把所有代码写在一个入口文件 app.js 里面。例如,工具性的东西,我们单独的分开出来,放在一个 utils 目录中,然后通过 ctx 关联起来。
在这一章,我们新增路由管理模块
,新建一个 urls 目录 存放控制器,然后这些控制器通过 app.js 的 koa-router 模块加载。通过下面的代码就一目了然了。
入口文件:app.js
const fs = require('fs');
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
// 首页
app.use(async (ctx, next) => {
if (ctx.request.path === '/') {
ctx.response.status = 200;
ctx.response.body = 'index';
}
await next();
});
// 其他页面通过 router 加载
let urls = fs.readdirSync(__dirname + '/urls');
urls.forEach((element) => {
let module = require(__dirname + '/urls/' + element);
/*
urls 下面的每个文件负责一个特定的功能,分开管理
通过 fs.readdirSync 读取 urls 目录下的所有文件名,挂载到 router 上面
API:https://github.com/koajs/router/blob/master/API.md#nested-routers
*/
router.use('/' + element.replace('.js', ''), module.routes(), module.allowedMethods());
});
app.use(router.routes())
.listen('3000',(err)=>{
if(err){
console.log('服仵器启动失败');
}else{
console.log('服务器启动成功');
}
});
router.use('/' + element.replace('.js', ''), module.routes(), module.allowedMethods()); 的<strong>补充说明</strong>
在我们这个例子中,就是
router.use('/home', module.routes(), module.allowedMethods());
这是一个嵌套路由。下面我们把相关代码放在一起,就很明了了。
const Router = require(‘koa-router’);
const router = new Router();
const home = new Router();
home.get(‘/’, (ctx, next) => {…});
home.get(‘/list’, (ctx, next) => {…});
// 被嵌套的模块路由
/home
作为父级路由router
的中间件使用router.use(‘/home’, home.routes(), home.allowedMethods());
// 响应 “/home ” and “/home/list”
app.use(router.routes());
路由管理文件:urls/home.js
const Router = require('koa-router');
const home = new Router();
// /home
home.get('/', async (ctx, next) => {
ctx.response.status = 200;
ctx.response.body = 'home';
await next();
})
// home/list
home.get('/list', async (ctx, next) => {
ctx.response.status = 200;
ctx.response.body = 'home-list';
await next();
})
module.exports = home;