首页 > 解决方案 > 具有相同路径的多条路线 - 使用下一条路线(例如功能切换、a/b 测试)

问题描述

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

让我们说:

在第一个控制器上,有一个守卫决定用户是否可以访问 BasketControllerNew 的 /checkout。返回 false 将抛出 ForbiddenException,很好。如果我抛出一个自定义异常,第二条路线也不会被执行。过滤器似乎也无法跳转到下一条路线。

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

我的首选行为是抛出一个自定义异常,例如 DisabledRouteException 或类似“请尝试下一个匹配路由”的东西。

另一个可能的用例可能是:

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

非常感谢您的支持并保持健康。大溪

标签: nestjs

解决方案


我找到了一个对我有用的解决方案:

概括:

  • 具有相同路径的多条路线
  • 引发异常的守卫
  • 过滤器捕获异常并执行下一个路由。

控制器的示例代码:

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

亲切的问候,大喜


推荐阅读