为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 NestJS 将路由前缀添加到特定模块?

如何使用 NestJS 将路由前缀添加到特定模块?

慕哥6287543 2023-08-10 10:58:16
我想在模块级别添加路由前缀和/或一般具有复杂的全局路由前缀逻辑。我知道我可以使用未记录的函数NestApplication.setGlobalPrefix来设置单个全局前缀:// main.tsapp.setGlobalPrefix(version);但是,在这种情况下,我想在模块级别设置前缀。看来我可以通过在控制器级别的装饰器中设置我想要的前缀来实现这一点://controler.ts@Get('/PREFIX/health')async getHealth() {  // TODO: implement  return {};}但这似乎相当老套且容易出错。当然有更好的方法吗?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

2021 年更新

NestJS 现在原生支持原始答案。

此外,当主要功能是对 API 进行版本控制时, NestJS v8还添加了更复杂的路由:

@Controller({

  path: 'cats',

  version: '1', // 👈

})

export class CatsController {

...

原答案

在 NestJS 中实现这一点的最可靠的方法是使用Nest-router包来创建路由树。


yarn add nest-router

# or npm i nest-router

main.ts在名为的旁边创建一个文件,routes.ts如下所示:


import { Routes } from 'nest-router';

import { YourModule } from './your/your.module';


export const routes: Routes = [

  {

    path: '/v1',

    module: YourModule,

  },

];

然后,在文件中,在加载任何其他模块之前app.module.ts添加路由器:


@Module({

  imports: [

    RouterModule.forRoutes(routes),

    YourModule,

    DebugModule

  ],


})

现在,当您导航到控制器时,在本例中YourModule,其所有路由都将以 例如 为前缀:v1


curl http://localhost:3000/v1/your/operation

使用这种方法可以为您提供最大的灵活性,因为每个模块不需要知道它的前缀如何;应用程序可以在更高级别上做出决定。与依赖静态字符串相比,几乎更高级的前缀可以动态计算。


查看完整回答
反对 回复 2023-08-10
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

对我来说,仅仅为了实现这一点而添加第三方包有点不必要,更不用说它过时/不维护的风险了。您可以在类中添加自定义路由前缀Controller。


  @Controller('custom/prefix')

  export const MyController {


     @Get('health')

     getHealth() {

       //this route would be: custom/prefix/health

       return {};

     }


     @Get('other')

     getOther() {

       //this route would be: custom/prefix/other

       return {};

     }

  }

然后只需将此控制器添加到您的Module


查看完整回答
反对 回复 2023-08-10
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

您现在可以使用 RouterModule 配置,也可以从全局前缀配置中排除某些路径(或混合使用两者):

路由器模块: https://docs.nestjs.com/recipes/router-module#router-module

全局前缀“排除”: https ://docs.nestjs.com/faq/global-prefix#global-prefix


查看完整回答
反对 回复 2023-08-10
  • 3 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信