router模块
中间件是对koa-router进行再一次的封装,使其能够通过一些简单的约束规范,就可以快速的实现路由层的配置。
index.js文件介绍
const _ = require('lodash')
const Router = require('koa-router')
/*
* 对router中间件再次封装
*
* routesPath:路由表文件位置
* controllerPath:路由表内controller文件位置的表达式
*
*/
module.exports = (opts) => {
let options = {
routesPath: process.cwd()+'/config/routes.js',
controllerPath: process.cwd()+'/app/controllers/{controller}.js'
};
if (opts && opts.routesPath){
options.routesPath = opts.routesPath;
}
if (opts && opts.controllerPath){
options.controllerPath = opts.controllerPath;
}
//加载引入路由配置文件
let routes = require(options.routesPath);
//迭代请求方式和路径作为key,如:'get /'
let routerPathKeys = _.keys(routes);
const router = new Router();
for (const routeKey of routerPathKeys){
//拆解'get /'部分为verb和url
const [verb, url] = routeKey.split(' ');
//拿到路由对应的控制层配置部分,如:'index#index'
const routeValue = routes[routeKey];
if (routeValue[0] === '/') {
router.redirect(url, routeValue, 301);
}else {
//拆解'index#index'部分为controllerPath和action
const [controllerPath, action] = routeValue.split('#');
//加载引入对应的控制器
const controller = require(options.controllerPath.replace('{controller}', controllerPath));
//判断路由表对应的控制器和处理方法是否存在
if (controller){
const actionInstance = controller[action];
if (actionInstance){
//添加到Router
router[verb](url, actionInstance);
}else{
throw new Error('Unable to find controller action for route:' + routeKey);
}
}else {
throw new Error('Unable to find controller for route:' + routeKey);
}
}
}
return router.routes();
}
路由表配置默认获取的是项目config目录下的routes.js文件,书写格式如下:
/*
* 路由表
*
* 格式为:
* '{请求方式(get/post/options/...)} {url路径}' : '{处理的controller名称}#{处理的方法名称}'
*
*/
module.exports = {
'get /': 'index#index',
'get /user/get': 'index#userGet',
'get /user/get/:id': 'index#userGetId'
}
要注意key唯一性的问题
加载的控制层类文件,默认是controllers目录下,对应着上面注释的“{处理的controller名称}”内容。
controller获取请求参数的方法
- get请求获取参数
格式如:http://abc.com/kkk?id=123
路由表
'get /kkk': 'index#kkkfna',
控制器
//此段代码在index控制器内的kkkfna方法内
//query对象包含的键值对,通过key方式获取
let id = ctx.query.id
- 动态路由
格式如:http://abc.com/kkk/123
路由表
'get /kkk/:id': 'index#kkkfnb',
控制器
//此段代码在index控制器内的kkkfnb方法内
//params对象包含的键值对,通过key方式获取
let id = ctx.params.id
- post方式
一般为表单提交方式form-data,需要引入’koa2-formidable’模块,否则控制器获取不到表单数据
路由表
'post /kkk/submit': 'index#kkkfnc',
控制器
//此段代码在index控制器内的kkkfnc方法内
//前端页面表单存在id和name两个属性
let id = ctx.request.body.id;
let name = ctx.request.body.name;
- 文件上传
需要引入’koa2-formidable’模块,并且设置好临时文件目录
路由表
'post /kkk/files': 'index#kkkfnd',
控制器
//此段代码在index控制器内的kkkfnd方法内
//文件数据存放在files对象内
let {body, files} = ctx.request
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/93641.html