处理 GraphQL 和 REST 的 NestJS AuthGuard

NestJS AuthGuard that handles both GraphQL and REST

根据文档,为了将 AuthGuard 用于 GraphQL 解析器的身份验证,我们必须重写 getRequest 方法,如下所示:

  getRequest(context: ExecutionContext) {
    const ctx = GqlExecutionContext.create(context);
    return ctx.getContext().req;
  }

我的大部分 API 使用 GraphQL,但其他 API 使用 REST 端点来处理文件上传。 (我提到了 this)现在,我正在使用两个 AuthGuard。一个是 GraphQL,其中我像上面那样覆盖了 getRequest。另一个是REST,除了getRequest(这次我没有覆盖它)和调用canActivate后从请求中提取user对象的方法外,代码完全相同。

GraphQL:

// getRequest is overridden
const user: User = this.getRequest(context).user;

休息:

// getRequest is NOT overridden
const { user } = context.switchToHttp().getRequest();

有什么方法可以尝试将这两个 AuthGuard 合二为一吗?

为什么 getRequest 方法没有这样的东西:

getRequest(context: ExecutionContext) {
  if (context.getType<ContextType | 'graphql'>() === 'graphql') {
    return GqlExecutionContext.create(context).getContext().req;
  }
  return context.switchToHttp().getRequest();
}

现在你只需要一名警卫。 req.user 无论使用 GraphQL 还是 REST

都将被相同地填充