# 声明式路由

# 1、声明式路由 VS 命令式路由

在介绍这两种路由方式之前,得先介绍一下 声明式编程,在维基百科中是这么定义的:

声明式编程(Declarative programming)是一种编程范式,与命令式编程相对立,它描述目标的性质,让计算机明白目标,而非流程。声明式编程不用告诉计算机问题领域,从而避免随之而来的副作用,而命令式编程则需要用算法来明确地指出每一步该怎么做。

# 2、如何将老版本路由升级到声明式路由写法?

astroboy-cli 工具提供了一个命令 ast convertRouter,可以将老版本路由快速升级到新版本路由写法,如下所示:

  Usage: convertRouter [options]

  升级路由配置到 V2 版本

  Options:

    --dir [dir]  指定路由文件目录,默认 app/routers
    -h, --help   output usage information

  Examples:

    $ ast convertRouter
    $ ast convertRouter --dir ./app/routers

# 3、路由配置选项

  • name:接口名字,没有实质性作用,只用于接口元数据记录,例如:获取商品详情
  • description:接口描述,没有实质性作用,只用于接口元数据记录。
  • method:HTTP 请求方法,目前支持 GETHEADPOSTPUTDELETEPATCH 以及 OPTIONS,它还可以是一个 HTTP 方法的数组
  • path:路由匹配 url 路径,还可以是一个 url 路径的数组
  • schema:用于验证请求的 schema 对象,必须符合 JSON Schema 格式,更多详细介绍请查看 ajv (opens new window)
    • body:当为 POST 或 PUT 方法时,校验请求主体。
    • query:校验 query,可以是一个完整的 JSON Schema 对象,它包括了值为 object 的 type 属性以及包含参数的 properties 对象,也可以仅仅是 properties 对象中的值 (见下文示例)。
    • header:校验 header 参数。
  • preHandler:前置处理请求的控制器实例方法名列表,例如:['adminAuth', 'apiAuth']
  • handler:处理请求的控制器类名及方法,中间通过 : 分隔,例如:'index.IndexController:getIndexHtml'

# 路由配置示例

module.exports = [
  {
    name: '关于页',
    description: '这是关于页的详细描述',
    method: 'GET',
    path: '/about',
    preHandler: ['foo', 'bar'],
    handler: 'index.AboutController:getIndexHtml',
    schema: {
      query: {
        type: 'object',
        properties: {
          name: { type: 'string' },
          age: { type: 'number' },
        },
        required: ['name'],
      },
    },
  },
];