【问题标题】:NestJS createParamDecorator return undefinedNestJS createParamDecorator 返回未定义
【发布时间】:2021-03-09 16:38:27
【问题描述】:

我使用的是 Nest 版本 ^6.7.2

我正在尝试创建一个从请求中获取 req.user 值的 createParamDecorator。

在 createParamDecorator 内部,req.user 有一个值,但是当我尝试使用装饰器在控制器中获取该值时,该值是未定义的。

const AuthSession = createParamDecorator((data, req) => {
  console.log(req.user); // session data
  return req.user;
});
Controller()
export default class AuthController {
  @Get("/token/ping")
  @UseGuards(AuthGuard("jwt"))
  tokenPing(@AuthSession() session: Session) {
    console.log(session); // undefined
    return session;
  }
}

编辑:我刚刚尝试更新到nestjs v7,我遇到了同样的问题

import { createParamDecorator, ExecutionContext } from "@nestjs/common";

const AuthSession = createParamDecorator((data: any, ctx: ExecutionContext) => {
  return { message: "asdf" };
});

export default AuthSession;
@Controller()
export default class AuthController {
  @Get("/token/ping")
  @UseGuards(AuthGuard("jwt"))
  tokenPing(@AuthSession() session: Session) {
    console.log(session); // undefined
    return session;
  }
}

【问题讨论】:

    标签: javascript node.js typescript nestjs


    【解决方案1】:

    您可以从 ExecutionContext 获取信息:

        import { createParamDecorator, ExecutionContext } from '@nestjs/common';
    
    export const User = createParamDecorator(
      (data: unknown, ctx: ExecutionContext) => {
        const request = ctx.switchToHttp().getRequest();
        return request.user;
      },
    );
    

    查看文档中的示例:Custom decorator

    【讨论】:

    • 适用于 v7+。我尝试更新到 v7,但我仍然不确定。我更新了原帖
    • 为什么要使用 Session?
    • 尝试不使用会话
    • 如果我更改类型或名称它没有效果
    • 装饰器中的console.log显示结果正确吗?
    【解决方案2】:

    我发现了问题所在。如果 ArgumentMetadata.type 既不是“body”也不是“param”,我有一个自定义验证 PipeTransform 返回 undefined。所以现在我只返回验证器转换方法的第一个参数(输入),如果 ArgumentMetadata.type 既不是“body”也不是“param”并且解决了问题。

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 2020-02-18
      • 2020-06-30
      • 2019-08-07
      • 1970-01-01
      • 2021-12-14
      • 2021-05-18
      • 1970-01-01
      • 2019-11-17
      相关资源
      最近更新 更多