我们在开发过程中不会把所有的代码都写在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/get
和http://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);