之前在服务器工作流程中分析,所有的路由动态挂到koa上。那此处便学习路由命中后都发生了什么。
还是以埋点请求为例:
// wap端监控接口
router.post('/log/tranCore/BuriedPointWxService',composition.noToken(),controller());
composition
关键点在于第二个参数,要闹明白,需先明白composition。因此我们要分析router.js中的getCompose方法:
/**
* 设置路由的compose
* @param mode 模式,safe,noToken,noSign
* @param type 类型,生产还是模拟
* @returns {Function}
*/
function getCompose(mode,type) {
var type = type || (isMock && !isProduct ? 'mock' : 'product');
return function (forceMock) {//forceMock 是否对单个接口进行强制模拟
type = forceMock && !isProduct ? 'mock' : type;
return compose(composeConfig[mode][type]);
}
}
假如我们composition.noToken,相当于getCompose('noToken')。
可以看到若是config.js中设置mock.open为true时,则type为true,即表达此时接口使用模拟数据。
由于我们是直接使用composition.noToken(),相当于forceMock为undefined时,type为‘mock‘。若生产环境或者mock.open=false时候,最终type为'product'。
compose
koa-compse的作用是依次执行generator函数。
当使用数据模拟的时候,composeConfig[‘noToken’][‘mock‘]依次执行koaBody,passMd5,mock;
当不使用模拟的时候,composeConfig[‘noToken’][‘mock‘]依次执行koaBody,passMd5,sign,proxy;
koaBody
koa-body解析请求的参数,使用后可以在this.request.body查看。
passMd5
把请求中的密码字段进行md5加密。
token
验证token,如果token有效继续下一个中间件,否则请求不能通过。可以推测,token是用于需要登录后身份验证的请求。
sign
请求参数进行md5加密。
proxy
对mserver进行请求。并发返回结果设置绑定到this.response.body中
mock
返回模拟数据,同样模拟数据绑定到this.response.body中
对不同模块分析后,便可理清整个流程,当时模拟数据时候:request->koabody->passmd5/sign/token->mserver;否则则为:request->koabody->passmd5->mock
controller
controller作为第三个参数,是请求结束后的一个回调。该回调默认,把请求的数据this.response.body赋值到this.body上。或者登录请求等,则执行其处理,一般是保存session,并把数据绑定到this.body。