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

Posted

技术标签:

【中文标题】如何使用 NestJS 为特定模块添加路由前缀?【英文标题】:How to add a route prefix to specific modules using NestJS? 【发布时间】:2021-02-28 01:13:21 【问题描述】:

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

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

// main.ts
app.setGlobalPrefix(version);

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

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

//controler.ts
@Get('/PREFIX/health')
async getHealth() 

  // TODO: implement
  return ;

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

【问题讨论】:

【参考方案1】:

2021 年更新

NestJS 现在supports the original answer natively.

此外,NestJS v8 also adds more sophisticated routing 当主要功能是版本控制 API 时:

@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

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

【讨论】:

包裹好像过时了。【参考方案2】:

对我来说,添加第三方软件包只是为了实现这一点有点不必要,更不用说它过时/无人维护的风险了。您可以在 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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于如何使用 NestJS 为特定模块添加路由前缀?的主要内容,如果未能解决你的问题,请参考以下文章

如何为路由组添加前缀以及如何在刀片视图中调用子路由

如何为所有节点/快速路由添加前缀

Slim (V3) 框架:为生成的链接添加前缀,但不为传入路由添加前缀

Nestjs路由器中控制器如何拆分路由

如何通过部署在 Heroku 上的 Nodejs/Nestjs 服务器为我的 Angular 前端提供服务?

NestJS 的自定义路由装饰器