80447704 2020-01-30
我们在开发过程中不会把所有的代码都写在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);