NestJS创建参数装饰器返回undefined。

4

我正在使用Nest版本^6.7.2。

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

在createParamDecorator内部,req.user具有值,但是当我尝试使用装饰器在控制器中获取该值时,该值为undefined。

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;
  }
}
3个回答

7

你可以首先从ExecutionContext中获取信息:

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

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);

请查看文档中的示例:自定义装饰器


为什么你在使用Session? - Youba
如果我更改类型或名称,它没有任何影响。 - user1991252
装饰器中的console.log是否正确显示了结果? - Youba
是的,我的意思是如果我删除“Session”或重命名“session”,它没有任何影响。 - user1991252
让我们在聊天中继续这个讨论 - Youba
显示剩余2条评论

3

我找到了问题所在。我拥有一个自定义验证PipeTransform,如果ArgumentMetadata.type既不是"body"也不是"param",则返回undefined。因此,现在,如果ArgumentMetadata.type既不是"body"也不是"param",我只返回验证器的transform方法的第一个参数(输入),这解决了问题。


0
注意,对于遇到类似问题的人来说,我错过了第一个数据参数,这导致了错误。 createParamDecorator((ctx: ExecutionContext) 会导致上下文未定义,而 createParamDecorator((data: unknown, ctx: ExecutionContext) 是可行的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接