之前在服务器工作流程中分析,所有的路由动态挂到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。

results matching ""

    No results matching ""