【发布时间】:2018-05-31 09:25:36
【问题描述】:
我刚刚开始使用Nestjs,我想知道如何使用路由前缀或通过 Express Router 实例对我的 API 进行版本控制?
理想情况下,我希望通过以下方式访问端点:
/v1
/v2
等等,所以我可以优雅地降级端点。我没有看到可以在哪里添加版本前缀。我知道可以在应用程序实例上设置global prefix,但这不适用于一组特定的端点。
【问题讨论】:
标签: nestjs
我刚刚开始使用Nestjs,我想知道如何使用路由前缀或通过 Express Router 实例对我的 API 进行版本控制?
理想情况下,我希望通过以下方式访问端点:
/v1
/v2
等等,所以我可以优雅地降级端点。我没有看到可以在哪里添加版本前缀。我知道可以在应用程序实例上设置global prefix,但这不适用于一组特定的端点。
【问题讨论】:
标签: nestjs
这是关于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],
},
];
不错!
【讨论】:
对于版本或任何前缀,您可以使用“全局前缀”:
【讨论】:
最好和最简单的方法是使用全局前缀
下面给出一个例子:
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!
【讨论】: