学习koa开发API(四)--- 文件目录设置

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

学习koa开发API(四)--- 文件目录设置

在根目录新增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

上一篇:使用koa+mongodb构建的仿知乎接口(一)


下一篇:小程序总是出现诡异的解密失败问题