nodejs-koa(二)路由配置
一:安装路由模块
文档:https://www.npmjs.com/package/koa-router
npm install --save koa-router
在app.js中加入:
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router'); //引入路由模块
const router = new Router(); // 实例化路由
router.prefix('/api'); //也可以设置路由前缀
// url匹配路由
router.get('/', (ctx, next) => {
console.log('hello koa')
ctx.body = 'hello koa';
});
router.get('/home',(ctx,next) => {
console.log('home')
ctx.body = 'home';
})
/**
* route.routes():合并所有的路由规则,返回合并后的路由中间件。
* app.use 加载中间件。
*/
app.use(router.routes());
/**
* 1:如果接口正确,请求方式不正确的时候,会返回 response header的Allow
* 2:如果接口正确,请求方式不正确的时候,返回 405 状态码,否则返回 404,有利于调试
*/
app.use(router.allowedMethods());
// app.use(router.routes()).use(router.allowedMethods()) // 也可以采用链式写法
app.listen(3000); // 监听配置中的3000端口浏览器执行一下:
二:路由自动加载
1:下载插件:https://www.npmjs.com/package/require-directory
npm install require-directory --save
2:搞一个路由文件,假设我们的路由都写在这里

const router = require('koa-router')(); //引入路由模块且实例化
/** 上面一步,相当于这两步合二为一
* const Router = require('koa-router'); //引入路由模块
* const router = new Router(); // 实例化路由
*/
// router.prefix('/home'); //也可以单独给这个路由文件加前缀
// url匹配路由
router.get('/home',(ctx,next) => {
console.log('home')
ctx.body = 'home';
})
module.exports = router;
3:用require-directory加载目录router下的路由文件
首先建立一个文件:RouterLib.js

const requireDirectory = require("require-directory"); ///路由自动注册包
const koa_router = require("koa-router"); //引入路由
const Router = new koa_router();
class InitManager {
// 统一初始化静态方法 app为 new Koa() 对象
static init(app) {
InitManager.app = app; //传递koa对象
InitManager.initLoadRouters(); //执行静态方法
}
// 路由自动注册
static initLoadRouters() {
// 获取路由目录的绝对路径
const directory = `${process.cwd()}/src/app/route`;
requireDirectory(module, directory, {
visit: (obj) => {
if(obj instanceof koa_router) {
//Router.use('/'+'api',obj.routes()) //统一添加路由前缀
Router.use(obj.routes());
}
}
})
InitManager.app.use(Router.routes()).use(Router.allowedMethods()); //加载路由中间件
}
}
module.exports = InitManager; 4:app.js中加载
const Koa = require('koa');
const app = new Koa();
require("./app/lib/RouterLib").init(app); //初始化路由,app为 new Koa对象
app.listen(3000); // 监听配置中的3000端口5:设置路由中间件
有时候我们需要控制一下路由,比如某个路由是否有权限调用,是否要具有session信息等,这时候就可以设置路由中间件。
// 全局设置
router.use(function (ctx, next) {
console.log('我是路由中间件');
ctx.session_name = '李小龙'; // 把name值传下面的路由。
return next();
});
// 单个设置
router.use('/home',function (ctx, next) {
console.log('我是路由中间件');
ctx.session_name = '李小龙'; // 把name值传下面的路由。
return next();
});
// 多个设置
router.use(['/home', '/goods'],function (ctx, next) {
console.log('我是路由中间件');
ctx.session_name = '李小龙'; // 把name值传下面的路由。
return next();
});完整的:
const router = require('koa-router')(); //引入路由模块且实例化
// router.prefix('/home'); //也可以单独给这个路由文件加前缀
// 全局设置
router.use(function (ctx, next) {
console.log('我是路由中间件');
ctx.session_name = '李小龙'; // 把session_name值传下面的路由。
return next();
});
// url匹配路由
router.get('/home',(ctx,next) => {
console.log(ctx.session_name); // 获取中间件传递过来的值
ctx.body = 'home';
})
router.get('/goods',(ctx,next) => {
console.log(ctx.session_name); // 获取中间件传递过来的值
ctx.body = 'goods';
})
//users/250
router.get('/users/:user', (ctx,next) => {
console.log(ctx.params.user)
})
module.exports = router;