具有相同路径的多条路线 - 使用下一条路线(例如功能切换,a/b 测试)

Multiple routes with same path - use next route (e.g. feature toggle, a/b testing)

有谁知道是否有一个选项可以在 nestjs 中使用相同的路径实现多个路由。

假设:

在第一个控制器中,有一个守卫决定用户是否可以访问 BasketControllerNew 的 /checkout。 返回 false 将抛出 ForbiddenException,没问题。 如果我抛出自定义异常,第二条路由也不会执行。 Filters 好像也不能跳转到下一个路由。

我想实现功能切换功能。 在这种情况下,例如使用全新控制器文件的新结帐流程。 例如,新的结帐流程应该由一些用户进行测试,或者可以通过功能切换启用和禁用。

我的首选行为是抛出自定义异常,如 DisabledRouteException 或类似的意思是“请尝试下一条匹配的路线”。

另一个可能的用例是:

有人知道如何实现这些东西吗?

非常感谢您的支持,祝您身体健康。 大溪

我找到了适合我的解决方案:

总结:

  • 相同路径的多条路线
  • 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,可以按照描述进行改进,应该改进。 测试只是一个非常小的快速和肮脏的解决方案,但如果您需要类似的解决方案,现在您可以从同一点开始。

亲切的问候, 大溪