具有相同路径的多条路线 - 使用下一条路线(例如功能切换,a/b 测试)
Multiple routes with same path - use next route (e.g. feature toggle, a/b testing)
有谁知道是否有一个选项可以在 nestjs 中使用相同的路径实现多个路由。
假设:
- /在 BasketControllerNew
中结帐
- /在 BasketController 中结帐
在第一个控制器中,有一个守卫决定用户是否可以访问 BasketControllerNew 的 /checkout。
返回 false 将抛出 ForbiddenException,没问题。
如果我抛出自定义异常,第二条路由也不会执行。
Filters 好像也不能跳转到下一个路由。
我想实现功能切换功能。
在这种情况下,例如使用全新控制器文件的新结帐流程。
例如,新的结帐流程应该由一些用户进行测试,或者可以通过功能切换启用和禁用。
我的首选行为是抛出自定义异常,如 DisabledRouteException 或类似的意思是“请尝试下一条匹配的路线”。
另一个可能的用例是:
- 带有通配符路由的 cms 尝试查找页面,因为它们的路径没有特定前缀
- 将有一个模块使用以 moduleA/ 为前缀的路由。
- 只要没有为特定客户启用该模块,moduleA/* 应该由通配符路由处理,因为此路径可以有页面。
有人知道如何实现这些东西吗?
非常感谢您的支持,祝您身体健康。
大溪
我找到了适合我的解决方案:
总结:
- 相同路径的多条路线
- Guard 抛出异常
- 捕获异常并执行下一条路由的过滤器。
控制器示例代码:
@Controller()
export class TestController {
@Get()
@UseGuards(TestGuard)
getHello(): string {
return "Hello";
}
@Get()
@UseGuards(TestGuard)
getHello2(): string {
return "Hello2";
}
@Get()
getHello3(): string {
return "Hello3";
}
}
守卫示例代码:
@Injectable()
export class TestGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
// add logic here to switch between execution or skip
throw new NotFoundException('Module not active');
}
}
过滤器示例代码:
@Catch(NotFoundException)
export class TestFilter implements ExceptionFilter {
catch(exception: NotFoundException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const next = ctx.getNext();
next();
}
}
在 main.ts 中全局启用过滤器:
async function bootstrap() {
const app = await NestFactory.create(TestModule);
app.useGlobalFilters(new TestFilter());
await app.listen(3000);
}
为了得到正确的处理,可以通过生成自定义异常和仅过滤来改进代码,目前所有 404 都会触发下一条路由。
在这个例子中,警卫总是会抛出异常,并以这种行为结束:
- getHello 的守卫将抛出 NotFoundException
- 过滤器会触发下一条路由
- getHello2 的守卫也会抛出 NotFoundException
- 过滤器会再次触发下一条路由
- getHello3 将被执行(没有守卫激活)
我的代码只是一个小的POC,可以按照描述进行改进,应该改进。
测试只是一个非常小的快速和肮脏的解决方案,但如果您需要类似的解决方案,现在您可以从同一点开始。
亲切的问候,
大溪
有谁知道是否有一个选项可以在 nestjs 中使用相同的路径实现多个路由。
假设:
- /在 BasketControllerNew 中结帐
- /在 BasketController 中结帐
在第一个控制器中,有一个守卫决定用户是否可以访问 BasketControllerNew 的 /checkout。 返回 false 将抛出 ForbiddenException,没问题。 如果我抛出自定义异常,第二条路由也不会执行。 Filters 好像也不能跳转到下一个路由。
我想实现功能切换功能。 在这种情况下,例如使用全新控制器文件的新结帐流程。 例如,新的结帐流程应该由一些用户进行测试,或者可以通过功能切换启用和禁用。
我的首选行为是抛出自定义异常,如 DisabledRouteException 或类似的意思是“请尝试下一条匹配的路线”。
另一个可能的用例是:
- 带有通配符路由的 cms 尝试查找页面,因为它们的路径没有特定前缀
- 将有一个模块使用以 moduleA/ 为前缀的路由。
- 只要没有为特定客户启用该模块,moduleA/* 应该由通配符路由处理,因为此路径可以有页面。
有人知道如何实现这些东西吗?
非常感谢您的支持,祝您身体健康。 大溪
我找到了适合我的解决方案:
总结:
- 相同路径的多条路线
- Guard 抛出异常
- 捕获异常并执行下一条路由的过滤器。
控制器示例代码:
@Controller()
export class TestController {
@Get()
@UseGuards(TestGuard)
getHello(): string {
return "Hello";
}
@Get()
@UseGuards(TestGuard)
getHello2(): string {
return "Hello2";
}
@Get()
getHello3(): string {
return "Hello3";
}
}
守卫示例代码:
@Injectable()
export class TestGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
// add logic here to switch between execution or skip
throw new NotFoundException('Module not active');
}
}
过滤器示例代码:
@Catch(NotFoundException)
export class TestFilter implements ExceptionFilter {
catch(exception: NotFoundException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const next = ctx.getNext();
next();
}
}
在 main.ts 中全局启用过滤器:
async function bootstrap() {
const app = await NestFactory.create(TestModule);
app.useGlobalFilters(new TestFilter());
await app.listen(3000);
}
为了得到正确的处理,可以通过生成自定义异常和仅过滤来改进代码,目前所有 404 都会触发下一条路由。
在这个例子中,警卫总是会抛出异常,并以这种行为结束:
- getHello 的守卫将抛出 NotFoundException
- 过滤器会触发下一条路由
- getHello2 的守卫也会抛出 NotFoundException
- 过滤器会再次触发下一条路由
- getHello3 将被执行(没有守卫激活)
我的代码只是一个小的POC,可以按照描述进行改进,应该改进。 测试只是一个非常小的快速和肮脏的解决方案,但如果您需要类似的解决方案,现在您可以从同一点开始。
亲切的问候, 大溪