我使用的是 Nest 版本 ^6.7.2我正在尝试创建一个 createParamDecorator 从请求中获取 req.user 值。在 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; }}
3 回答
牛魔王的故事
TA贡献1830条经验 获得超3个赞
您可以首先从 ExecutionContext 获取信息:
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const User = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);
繁星coding
TA贡献1797条经验 获得超4个赞
我明白问题出在哪里了。我有一个自定义验证 PipeTransform,如果 ArgumentMetadata.type 既不是“body”也不是“param”,则返回未定义。所以现在,如果 ArgumentMetadata.type 既不是“body”也不是“param”,我只返回验证器转换方法的第一个参数(输入),这解决了问题。
慕虎7371278
TA贡献1802条经验 获得超4个赞
请注意,对于那些面临类似问题的人,我错过了第一个数据参数,它引发了我的错误。
createParamDecorator((ctx: ExecutionContext)
会导致未定义的上下文,而createParamDecorator((data: unknown, ctx: ExecutionContext)
有效。
添加回答
举报
0/150
提交
取消