Router和Interceptor配置

业务逻辑和数据的处理主要靠router和interceptor配置来实现。interceptor比router优先执行,因此interceptor可以处理一些公共逻辑。

配置目录

router配置目录在routerDir,interceptor配置目录在interceptorDir. 可在目录中写多个js文件,每个js文件导出一个配置对象,一个配置对象可以有多个router或interceptor配置。maty框架将自动加载并处理。

配置项目

router和interceptor的配置项大多数是一致的,不一样的地方会特别说明。

完整的配置项示例
module.exports = {
  '/route/:type, /route, /route/hello/world': {
    method: 'get, post',
    api: 'post:http://localhost:8080/api/comment/list'
    cache: false,
    timeout: 1000,
    series: false,
    proxy: null,
    pageCache: false,
    query(ctx) {
      return {
        pageSize: 20,
        type: 1
      };
    },
    body(ctx) {
      return {};
    },
    handle(data, ctx) {
      return data.list;
    },
    view: 'route/list'
  }
}

'/route/:type, /route, /route/hello/world'

route地址,可以设置为一个或英文逗号分隔的多个地址,服务正常启动后,该地址可以被访问。

当访问 /route/hello, /route,/router/hello/world三个不同的地址时,都将返回 view配置的 router/list 页面。:type是参数占位符,访问 /router/hello 时,ctx.param.type = hello

更多配置规则可以参考maty所使用的解析库文档:path-to-regexp

假如配置了两个路由地址分别为: /route/:type 和 /route/hi, 是不会产生冲突的,请求地址将优先匹配 无参路由/route/hi,其次才去匹配 带参路由 /route/:type。

interceptor配置规则相同,但一般拦截无参路由或使用通配符。

interceptor不会产生路由参数。其参数来自于匹配的路由。

例如配置为 /route/(.*) ,拦截/route开头的所有请求。

method

可选项,类型String。

配置路由地址的请求方式,默认是 get 请求。可以配置为逗号间隔的多个请求方式。当遇到请求该路由地址时返回405错误,则需要检查method配置是否正确。

interceptor不支持该项配置,interceptor针对所有的请求方式。

api

可选项,类型String|Object|Array|Function。

配置获取数据的后端api接口地址。可以是带域名的绝对地址,也可以是相对地址,然后用handleAPI配置来处理。

api地址可使用前缀post: get: put: delete: 来指定该api的请求方式,否则默认ctx.method请求方式。

api地址一般为Sting的字符串,但也可以是Object类型。只有object类型的配置项支持配置数据名name,可用于多个api配置存在的命名冲突。object支持配置项如下:

api: {
  api: 'post:http://localhost:8080/api/comment/list' // api地址
  name: 'comments',  // api返回的数据存储名,可解决多个api数据名冲突的情况
  cache: false,  // 是否缓存数据
  series: false, // 是否串联请求api
  query(ctx) {   // 设置请求的get query参数
    return {};
  },
  body(ctx) {    // 设置请求的post body参数
    return {};
  },
  handle(data, ctx) {  // 处理api返回的数据
    return data.comments;
  }
}

当api配置为Array类型,array item可以是上述的String或Object类型,也可以是一个函数Function,该函数执行完返回字符串地址或配置对象。

api: ['/api/local/v2',
  {
    api: 'post:http://localhost:8080/api/comment/list' // api地址
    // ...
  },
  (ctx) => { return '/api/local/v1'; }
]

当api为Function配置类型,接收参数为ctx,可以返回String或Array类型的配置。若返回空,则不做接口请求。示例如下:

api(ctx) {
  if (ctx.query.content) {
    reutn '/api/more/content';
  }

  if (ctx.query.list) {
    return [
      '/api/more/content',
      {
        api: '/api/list',
        ...
      }
    ]
  }
}

api配置相对灵活,更多参见项目实践:api的组合配置

cache

可选,类型Boolean|Number|Function。

是否缓存api返回的数据。默认false表示不缓存,true表示永久缓存。

当值类型为Number,表示缓存时间的毫秒数。

当为Function时,接收ctx为参数,返回Boolean或Number。

timeout

可选,类型Number。

api请求的超时时间,为防止请求卡死在api无响应时。单位毫秒ms。

interceptor无此配置项。

series

可选,类型Boolean,默认false。

当router或interceptor配置了多个api地址,series决定了这么多api是并行请求还是串行请求。同时可以单独配置某个api是串行请求,而其他api是并行请求。串行请求的api结果,可以在并且请求api的handle方法中通过ctx.apiData来获取。

所以,若有api数据的依赖,可以设置series为true。

proxy

可选,类型String|Function。

转发请求,可以设置为一个api字符串地址(和上面的api配置项为字符串类型时的规则相同),或一个返回api字符串地址的函数,ctx作为参数传入该函数。

该配置具备排他性,设置了proxy值,则其他配置项均无效。

当不需要处理api数据时,可以使用该配置项,例如转发一个验证码图片地址,或下载文件等。api的响应内容和响应头都会原样转发到浏览器端。

interceptor无此配置。

pageCache

可选,类型Boolean,默认false.

设置为true时,将在响应头上加上禁止缓存。

interceptor无此配置。

query(ctx)

可选,类型Function。

需要定制传递给api的get参数时,可以在该配置中处理并返回一个query对象。

body(ctx)

可选,类型Function。

需要定制传递给api的post/put参数时,可以在该配置中处理并返回一个body对象。

handle(data, ctx)

可选,类型Function

用于处理api返回的数据。第一个参数data是一个或多个api地址返回数据的集合。本质是ctx.apiData的引用.

data的keys由api为object类型的name配置项优先决定,无name配置项时,由apiDataName()获取。

若api配置项为Array类型,且array item中配置了handle项,则handle项的data参数是api接口返回的原数据结果,而不是ctx.apiData的引用.

interceptor的handle只有在api为string类型值时有效

view

可选,类型String|Function,默认值为ctx.path

设置模板文件的地址,是相对于viewDir的相对地址。若使用默认引擎,则还可以省略后缀,否则不可以省略后缀。比如 $viewDir/main/list.njk 模板文件,可以设置view: 'main/list' 。

当为Function类型时,接收ctx为参数,返回一个模板地址。

interceptor无此配置。

Last updated