nestjs - 具有相同路径的多条路线 - 使用下一条路线(例如功能切换、a/b 测试)
问题描述
有人知道是否可以选择在nestjs中使用相同的路径实现多个路由。
让我们说:
- /在 BasketControllerNew 中结帐
- /在 BasketController 中结帐
在第一个控制器上,有一个守卫决定用户是否可以访问 BasketControllerNew 的 /checkout。返回 false 将抛出 ForbiddenException,很好。如果我抛出一个自定义异常,第二条路线也不会被执行。过滤器似乎也无法跳转到下一条路线。
我想实现功能切换功能。在这种情况下,例如一个带有全新控制器文件的新结帐过程。例如,新的结帐流程应该由一些用户进行测试,或者可以通过功能切换来启用和禁用。
我的首选行为是抛出一个自定义异常,例如 DisabledRouteException 或类似“请尝试下一个匹配路由”的东西。
另一个可能的用例可能是:
- 带有通配符路由的 cms,它尝试查找页面,因为它们的路径中没有特定的前缀
- 将有一个模块使用以 moduleA/ 为前缀的路由。
- 只要没有为特定客户启用模块,moduleA/* 就应该由通配符路由处理,因为此路径中可能存在页面。
有人知道如何实现这些东西吗?
非常感谢您的支持并保持健康。大溪
解决方案
我找到了一个对我有用的解决方案:
概括:
- 具有相同路径的多条路线
- 引发异常的守卫
- 过滤器捕获异常并执行下一个路由。
控制器的示例代码:
@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,可以按照描述进行改进并且应该改进。该测试只是一个非常小的快速而肮脏的解决方案,但如果您需要类似的解决方案,现在您可以从同一点开始。
亲切的问候,大喜