zoukankan      html  css  js  c++  java
  • 学习koa开发API(四)--- 文件目录设置

    我们在开发过程中不会把所有的代码都写在index.js文件中,我们会建立如下目录结构:

    在根目录新增app文件夹,分别新增controllers文件夹、routes文件夹和index.js文件。

    新增路由文件

    假设我们需要开发两类接口,一种是有关图书的,一种是有关用户的。那么我们子routes文件夹下新增index.js、book.js和user.js文件。

    // book.js
    const Router = require('koa-router');
    const router = new Router({prefix:'/book'});
    ​
    router.get("/get",(ctx,next)=>{
      ctx.body = '<h1>获得一本图书</h1>';
    });
    ​
    module.exports = router;
    // user.js
    const Router = require('koa-router');
    const router = new Router({prefix:'/user'});
    ​
    router.get("/edit",(ctx,next)=>{
      ctx.body = '<h1>编辑用户信息</h1>';
    });
    ​
    module.exports = router;

    我们如果一个个路由进行注册会相当的麻烦,所以我们在index.js下将路由注册并导出:

    // index.js
    const fs = require("fs");
    module.exports = (app)=>{
      // 同步读取当前目录下的文件
      fs.readdirSync(__dirname).forEach(file => {
        if(file === 'index.js') return;
        const router = require(`./${file}`);
        app.use(router.routes()).use(router.allowedMethods());
      });
    }

    修改routes同级的index.js

    const Koa = require('koa');
    const app = new Koa();
    const routing = require('./routes');
    ​
    // router注册到app
    routing(app);
    app.listen(3000);

    记得修改package.json文件,

    "start": "nodemon app/index.js"

    访问http://localhost:3000/book/gethttp://localhost:3000/user/edit成功。

    新增控制器文件

    如果每个路由都要写一堆逻辑代码也不方便维护,所以我们将逻辑代码写在控制器文件夹中。

    在controllers下新增book.js和user.js

    // book.js
    class BookCtl {
      get(ctx){
        ctx.body = '<h1>获得一本图书</h1>';
      }
    }
    module.exports = new BookCtl();
    // user.js
    class UserCtl {
      edit(ctx){
        ctx.body = '<h1>编辑用户信息</h1>';
      }
    }
    module.exports = new UserCtl();

    修改routes下的book.js和user.js

    // book.js
    const Router = require('koa-router');
    const router = new Router({prefix:'/book'});
    const bookCtl = require("../controllers/book");
    ​
    router.get("/get",bookCtl.get);
    ​
    module.exports = router;
    // user.js
    const Router = require('koa-router');
    const router = new Router({prefix:'/user'});
    const userCtl = require("../controllers/user");
    router.get("/edit",userCtl.edit);
    ​
    module.exports = router;

    补充

    关于自动注册路由还可以使用require-directory

    npm i require-directory --save

    修改app下的index.js。

    const Koa = require('koa');
    const requireDirectory = require("require-directory");
    const Router = require('koa-router')
    const app = new Koa();
    ​
    const requireRouterPath = `${process.cwd()}/app/routes` // process.cwd 获取程序根目录
    // requireDirectory 第一个参数固定,当有第二个参数时,可以传递第三个参数;
    // 这里的第二个参数是要加载的router的目录;
    // 第三个参数是一个对象,对象的值是一个函数,键可以有三种:白名单(include)、黑名单(Blacklisting)、在对象加载时访问它们(visit)
    const modules = requireDirectory(module, requireRouterPath, { visit: whenLoadModule })
    function whenLoadModule(obj) {
      if (obj instanceof Router) {
        app.use(obj.routes(), obj.allowedMethods())
      }
    }
    ​
    app.listen(3000);

    参考:require-directory

  • 相关阅读:
    分红
    MyCat学习笔记
    vue 事例
    linux 端口
    vue安装
    react入门一(转)
    javascript 中各种继承方式的优缺点 (转)
    vue路由复习(转载)
    ES6新特性
    js面试中长见的算法题(转载)
  • 原文地址:https://www.cnblogs.com/armouy/p/12243289.html
Copyright © 2011-2022 走看看