Fastify能否创建路径相同但参数名不同的路由?
Fastify同层级多参数路由的非文档化实现方案
你要的那种同层级备选参数的实现,确实可以通过Fastify一些未被官方文档重点提及的特性来实现,以下是两种可行方案:
方案一:自定义路由约束函数
利用Fastify的constraints.custom配置项,通过自定义函数判断请求参数的格式,让不同路由匹配对应格式的请求:
// 匹配数字类型ID的路由 fastify.get('/thing/:param', { constraints: { custom: (req) => /^\d+$/.test(req.params.param) }, schema: { params: { type: 'object', properties: { param: { type: 'integer' } } } } }, async (req) => { return { handler: 'id-handler', value: req.params.param } }) // 匹配字符串类型名称的路由 fastify.get('/thing/:param', { constraints: { custom: (req) => /^[a-zA-Z]+$/.test(req.params.param) }, schema: { params: { type: 'object', properties: { param: { type: 'string', pattern: '^[a-zA-Z]+$' } } } } }, async (req) => { return { handler: 'name-handler', value: req.params.param } })
这个方法的核心是让Fastify在匹配路由时,先通过自定义约束函数过滤请求,只有符合条件的请求才会触发对应的路由处理函数。虽然官方文档提到了constraints,但并未详细说明可以用自定义函数区分同路径路由,属于偏进阶的非公开推荐用法。
方案二:利用底层path-to-regexp的备选语法
Fastify底层依赖path-to-regexp库,你可以直接使用该库的命名捕获组备选语法来定义路径,然后在单个路由内根据参数类型分流:
fastify.get('/thing/:id(\\d+)|:name([a-zA-Z]+)', { schema: { params: { type: 'object', properties: { id: { type: 'integer' }, name: { type: 'string' } }, oneOf: [ { required: ['id'] }, { required: ['name'] } ] } } }, async (req) => { if (req.params.id) { // 处理ID逻辑 return { type: 'id', value: req.params.id } } else { // 处理名称逻辑 return { type: 'name', value: req.params.name } } })
这种写法实现了你想要的“同层级备选参数”效果,且不需要在处理器里额外写正则判断,而是通过schema的oneOf来约束参数。
内容的提问来源于stack exchange,提问作者person0
相关产品推荐
相关产品推荐

