【问题标题】:nestjs context.swithToHttp().getRequest() returns undefinednestjs context.swithToHttp().getRequest() 返回未定义
【发布时间】:2020-02-18 05:14:42
【问题描述】:

我想为 Graphql 创建 RolesGuard

我像下面这样创建角色装饰器

export const Roles = (...roles: string[]) => SetMetadata('roles', roles);

然后我创建 GqlAuthGuard 和 RolesGuard,如下所示

gql-gurad.ts

@Injectable()
export class GqlAuthGuard extends AuthGuard('jwt') {
    getRequest(context: ExecutionContext){
        const ctx = GqlExecutionContext.create(context);
        return ctx.getContext().req;
    }
}

role-guard.ts

@Injectable()
export class RolesGuard implements CanActivate {
constructor(private readonly reflector: Reflector) {}

    canActivate(context: ExecutionContext): boolean {
        const roles = this.reflector.get<string[]>('roles', context.getHandler());
        if (!roles) {
            return true;
        }
        const request = context.switchToHttp().getRequest();
        const user = request.user;

        ...
    }
}

但是const request = context.switchToHttp().getRequest(); 行返回未定义。

我正在使用像下面这样的两个警卫

@AuthGuard(GqlAuthGuard, RolesGuard)
@Mutation(...)

我错过了什么??

【问题讨论】:

    标签: graphql nestjs


    【解决方案1】:

    我自己解决了。

    const request = context.switchToHttp().getRequest();
    const user = request.user;
    
    to
    
    const ctx = GqlExecutionContext.create(context);
    const user = ctx.getContext().req.user;
    

    我是从nestjs discord 频道找到的。

    https://discordapp.com/channels/520622812742811698/520649487924985885

    【讨论】:

    • context.switchToHttp().getRequest&lt;Request&gt;() 返回 undefined 的另一个用例是 websocket。我遇到了一个全局警卫+添加websocket(通过graphql)的案例。例如,如果依赖于 HTTP 标头,则必须为 websocket 重新构想这种保护。
    猜你喜欢
    • 2021-07-30
    • 2021-03-09
    • 2018-10-28
    • 2020-06-30
    • 2019-08-07
    • 1970-01-01
    • 2021-12-14
    • 2021-05-27
    • 2021-05-18
    相关资源
    最近更新 更多