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;