版本控制 Nestjs 路由?
Versioning Nestjs routes?
我刚刚开始使用 Nestjs,我想知道如何使用路由前缀或通过 Express Router 实例对 API 进行版本控制?
理想情况下,我想通过以下方式访问端点:
/v1
/v2
等,这样我就可以优雅地降级端点。我看不到在哪里可以添加版本前缀。我知道可以在应用程序实例上设置 global prefix,但这不适用于一组特定的端点。
这里是关于 RouterModule
https://github.com/nestjs/nest/issues/255 的公开讨论。我明白这个功能有多重要,所以它应该会在不久的将来出现。此时需要将v1
/v2
直接放入@Controller()
装饰器中
Router Module 来拯救,Nest RouterModule
现在组织你的路线很轻松。
看看设置起来有多简单。
const routes: Routes = [
{
path: '/ninja',
module: NinjaModule,
children: [
{
path: '/cats',
module: CatsModule,
},
{
path: '/dogs',
module: DogsModule,
},
],
},
];
@Module({
imports: [
RouterModule.forRoutes(routes), // setup the routes
CatsModule,
DogsModule,
NinjaModule
], // as usual, nothing new
})
export class ApplicationModule {}
这将产生如下内容:
ninja
├── /
├── /katana
├── cats
│ ├── /
│ └── /ketty
├── dogs
├── /
└── /puppy
当然,对于路由的版本控制,您可以执行类似于此的操作
const routes: Routes = [
{
path: '/v1',
children: [CatsModule, DogsModule],
},
{
path: '/v2',
children: [CatsModule2, DogsModule2],
},
];
不错!
对于版本或者任何前缀,你可以使用"global prefix":
最好和最简单的方法是使用全局前缀
例子如下:
import { VersioningType } from "@nestjs/common";
app.enableVersioning({
type: VersioningType.URI,
});
app.setGlobalPrefix("api/v1"); //edit your prefix as per your requirements!
您可以使用以下结构从全局前缀中排除路由:
app.setGlobalPrefix('v1', {
exclude: [{ path: 'health', method: RequestMethod.GET }], // replace your endpoints in the place of health!
});
或者,您可以将路由指定为字符串(它将应用于每个请求方法):
app.setGlobalPrefix('v1', { exclude: ['cats'] }); // replace your endpoints in the place of cats!
根据 main.ts
内的最新文档,在 const app = await NestFactory.create(AppModule)
使用
之后
// Versioning
app.enableVersioning({
type: VersioningType.URI,
defaultVersion: '1',
prefix: 'api/v',
});
除非指定
,否则这将为您的所有路由提供默认前缀 /api/v1
在控制器使用中覆盖版本
@Controller({version:'2'})
控制器上的装饰器 class
要在路由级别覆盖版本,请使用 @Version('2')
以上控制器方法
注意:如果您使用 swagger,请确保在 SwaggerModule.createDocument()
之前调用 app.enableVersioning()
我刚刚开始使用 Nestjs,我想知道如何使用路由前缀或通过 Express Router 实例对 API 进行版本控制?
理想情况下,我想通过以下方式访问端点:
/v1
/v2
等,这样我就可以优雅地降级端点。我看不到在哪里可以添加版本前缀。我知道可以在应用程序实例上设置 global prefix,但这不适用于一组特定的端点。
这里是关于 RouterModule
https://github.com/nestjs/nest/issues/255 的公开讨论。我明白这个功能有多重要,所以它应该会在不久的将来出现。此时需要将v1
/v2
直接放入@Controller()
装饰器中
Router Module 来拯救,Nest RouterModule
现在组织你的路线很轻松。
看看设置起来有多简单。
const routes: Routes = [
{
path: '/ninja',
module: NinjaModule,
children: [
{
path: '/cats',
module: CatsModule,
},
{
path: '/dogs',
module: DogsModule,
},
],
},
];
@Module({
imports: [
RouterModule.forRoutes(routes), // setup the routes
CatsModule,
DogsModule,
NinjaModule
], // as usual, nothing new
})
export class ApplicationModule {}
这将产生如下内容:
ninja
├── /
├── /katana
├── cats
│ ├── /
│ └── /ketty
├── dogs
├── /
└── /puppy
当然,对于路由的版本控制,您可以执行类似于此的操作
const routes: Routes = [
{
path: '/v1',
children: [CatsModule, DogsModule],
},
{
path: '/v2',
children: [CatsModule2, DogsModule2],
},
];
不错!
对于版本或者任何前缀,你可以使用"global prefix":
最好和最简单的方法是使用全局前缀
例子如下:
import { VersioningType } from "@nestjs/common";
app.enableVersioning({
type: VersioningType.URI,
});
app.setGlobalPrefix("api/v1"); //edit your prefix as per your requirements!
您可以使用以下结构从全局前缀中排除路由:
app.setGlobalPrefix('v1', {
exclude: [{ path: 'health', method: RequestMethod.GET }], // replace your endpoints in the place of health!
});
或者,您可以将路由指定为字符串(它将应用于每个请求方法):
app.setGlobalPrefix('v1', { exclude: ['cats'] }); // replace your endpoints in the place of cats!
根据 main.ts
内的最新文档,在 const app = await NestFactory.create(AppModule)
使用
// Versioning
app.enableVersioning({
type: VersioningType.URI,
defaultVersion: '1',
prefix: 'api/v',
});
除非指定
,否则这将为您的所有路由提供默认前缀/api/v1
在控制器使用中覆盖版本
@Controller({version:'2'})
控制器上的装饰器 class
要在路由级别覆盖版本,请使用 @Version('2')
以上控制器方法
注意:如果您使用 swagger,请确保在 SwaggerModule.createDocument()
app.enableVersioning()