在 NestJS 上使用 'useGlobalGuards' 时排除端点

Exclude endpoints when using 'useGlobalGuards' on NestJS

我刚开始在我的 main.ts 文件上使用 useGlobalGuards 方法:

[...]
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe({
    transform: true,
  }))
  app.useGlobalGuards(new AuthGuard)
[...]

因此,所有端点都在使用我的 AuthGuard,如果请求 header 上没有有效的授权令牌,它会抛出 401 错误...在此之前,我在每个 class 上使用 @UseGuards(AuthGuard),所以如果我想做一个 public api(比如用户创建),我只需要删除这个装饰器。

是否可以使用 useGlobalGuards 并且仍然只有少数 public api 不需要身份验证令牌? (useGlobalPipes 方法的相同问题)

This is a common use case described in the docs.

本质上,您需要为端点创建某种元数据,允许使用 publicly 使用 @SetMetadata() 或自定义装饰器,并在守卫中读取该元数据。如果元数据存在,则应将其视为 public 路由并应跳过身份验证。