Согласно документам, чтобы использовать AuthGuard для аутентификации преобразователей GraphQL, мы должны переопределить метод getRequest следующим образом:
getRequest(context: ExecutionContext) {
const ctx = GqlExecutionContext.create(context);
return ctx.getContext().req;
}
Большинство моих API-интерфейсов используют GraphQL, но другие используют конечные точки REST для обработки загрузки файлов. (Я сослался на это) Теперь я использую два AuthGuard. Один для GraphQL, в котором я переопределил getRequest, как указано выше. Другой - для REST, код которого полностью тот же, за исключением getRequest (на этот раз я не отменял его) и способа извлечения объекта user из запроса после вызова canActivate.
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.