docs: async function JustifyReq(ctx, next)
  {
  
      CTX = ctx;
      //解析接口文件
      let {TPL,routeName} = _TPL(ctx);
      // isDebug && console.log('JustifyReq',TPL,routeName);
      if(TPL&&typeof TPL != 'object'){_formatErr({no: 500, msg: TPL});return;}
      try {
          if (TPL && routeName) {
              //接口访问计数
              itCount[routeName] = (itCount[routeName]?itCount[routeName]:0)+1;
  
              //判断url的一致性
              if(TPL.url != url.parse(ctx.url).pathname){
                  _formatErr({no: 400, msg: "请求的url与接口不一致"});
                  return;
              }
              //有文件需要解析,并且删除多余文件
              if(typeis(ctx, 'multipart/form-data')){// TPL.hasFile 不一定要接口文件才去解析
                  isDebug && console.log('-----有form格式传递过来的请求')
                  let data = await coForm(ctx,(upfileRoot?{uploadDir:upfileRoot}:null));
                  isDebug && console.log('file',data);
                  removeOtherFile(TPL,ctx);//删除多余文件
              }
  
              //获取请求的参数
              let $B=('GET'==ctx.method)?ctx.request.query:ctx.request.body;
              let $S=ctx.session || {};
              let $U=$S.user;
              let err;
              //认证接口授权状况
              if(TPL.grant && (err=_CheckCnd(TPL.grant,403,'grant',$B,$S,$U))) {
                  if(!itGrantFunc || ! (await itGrantFunc(ctx))) {//itGrantFunc 这个是个异步方法
                      if(!$U){
                          return _formatErr({no: 401, msg: "您尚未登录"});
                      }else {
                          return _formatErr({no: 403, msg: "您无权访问该接口"});
                      }
                  }
              }
  
              //请求参数认证
              if (TPL.params) {
                  let msg ;
                  try{
                      if((msg=CheckParams(TPL.params,$B))){
                          _formatErr({no:400,msg:`${CTX.usedefault?'默认值错误:':''}${msg}`});
                          if(TPL.hasFile){//有文件就需要移除文件
                              removeFormpart(TPL,ctx);//删除文件
                          }
                          return ;
                      }
                  }catch(err){
                      _formatErr({no:500,msg:`${err}}`});
                      return ;
                  }
              }
  
              if(TPL.pretreat) try{
                  eval(TPL.pretreat);
              }
              catch(e){
                  return _formatErr({no:500,msg:'接口[pretreat]错:'+e.toString()});
              }
  
              if(TPL.check && (err=_CheckCnd(TPL.check,400,'check',$B,$S,$U)))
                  return _formatErr(err);
              await next();
          } else if ('GET'==ctx.method) {//渲染模板时，不需要接口文档{
              await next();
          } else{
              _formatErr({no:404,msg:`访问的模板不存在`});
          }
  
      } catch (err) {
          //这里统一处理 接口文档的error参数返回
          console.log('error',err)
          if (err.message && TPL && TPL.error && TPL.error[err.message]) {
              // console.log('tttt',data.error[err.message])
              _formatErr({no: err.message, msg: TPL.error[err.message]})
          } else if(err.no){
              _formatErr(err);
          } else{
              _formatErr({no: 500, msg: err.message+'/n'+err.stack});
          }
          if(TPL && TPL.hasFile){
              removeFormpart(TPL,ctx);
          }
      }
  }