道者编程

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;
 

 


最新评论:
我要评论:

看不清楚