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

我想在模块级别添加路由前缀和/或一般具有复杂的全局路由前缀逻辑。


我知道我可以使用未记录的函数NestApplication.setGlobalPrefix来设置单个全局前缀:


// main.ts

app.setGlobalPrefix(version);

但是,在这种情况下,我想在模块级别设置前缀。


看来我可以通过在控制器级别的装饰器中设置我想要的前缀来实现这一点:


//controler.ts

@Get('/PREFIX/health')

async getHealth() {


  // TODO: implement

  return {};

}

但这似乎相当老套且容易出错。当然有更好的方法吗?


慕哥6287543
浏览 292回答 3
3回答

达令说

2021 年更新NestJS 现在原生支持原始答案。此外,当主要功能是对 API 进行版本控制时, NestJS v8还添加了更复杂的路由:@Controller({  path: 'cats',  version: '1', // 👈})export class CatsController {...原答案在 NestJS 中实现这一点的最可靠的方法是使用Nest-router包来创建路由树。yarn add nest-router# or npm i nest-routermain.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,其所有路由都将以 例如 为前缀:v1curl http://localhost:3000/v1/your/operation使用这种方法可以为您提供最大的灵活性,因为每个模块不需要知道它的前缀如何;应用程序可以在更高级别上做出决定。与依赖静态字符串相比,几乎更高级的前缀可以动态计算。

汪汪一只猫

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

梵蒂冈之花

您现在可以使用 RouterModule 配置,也可以从全局前缀配置中排除某些路径(或混合使用两者):路由器模块: https://docs.nestjs.com/recipes/router-module#router-module全局前缀“排除”: https ://docs.nestjs.com/faq/global-prefix#global-prefix
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript