NestJS使用不同的通配符匹配路由

jrr*_*asm 5 parameters routes nestjs

你好,我想在 NestJS 中匹配一条路由,如下所示:

@Controller('posts')
export class PostsController {
  @Get(:id)
  getPostById() {}

  @Get(:slug)
  getPostBySlug() {}
}
Run Code Online (Sandbox Code Playgroud)

问题是请求永远不会命中 slug 路由,如何配置路由以使 id 仅与数字匹配,而第二个仅与字母和破折号匹配?

非常感谢 :)

小智 7

看起来 @nest/common 依赖项中有一个正则表达式包的路径,我检查过 - 你真的可以使用它。

https://www.npmjs.com/package/path-to-regexp

现在您可以通过设置正则表达式使 id 仅匹配数字:

@Get('/:id(\\d+)')
Run Code Online (Sandbox Code Playgroud)

我在NestJS官方文档中没有找到功能描述,但它是有效的。我的@nest/common 软件包版本是8.4.1。


Jay*_*iel 2

这是不可能的,因为当 Express 或 Fastify 为此设置路由器时,它只是查看与正则表达式匹配的内容,并且没有限定符表示“这专门是一个slug”或“这绝对是一个id”,因此所有 Express或者 Fastify 能做的就是匹配第一条路由。您需要在控制器或服务中设置一个开关来根据参数调用任一方法,或者您需要在使用 URL 参数之前使路由可识别。@Get('/id/:id')或者@Get('/slug/:slug')