# 声明式路由
# 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 请求方法,目前支持
GET
、HEAD
、POST
、PUT
、DELETE
、PATCH
以及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'],
},
},
},
];