koa第七章:路由管理模块(1)

作者: xusx 分类: JavaScript 发布时间: 2022-03-29 23:34 浏览:21

我们在《 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;

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!