NestJS中@Body装饰器解析:@Body负载引用对象的存储位置
关于NestJS中@Body注入变量的存储位置
Great question! Let's break this down step by step so you get a clear picture:
1. 局部变量:函数执行时的内存对象
首先,你代码里的user变量是create函数执行上下文里的局部变量,存储在NestJS服务器的内存中。当客户端发送POST请求到这个接口时:
- NestJS会先解析HTTP请求的body内容
- 按照你定义的
IUserBase类型(如果用了TypeScript)做类型映射,同时如果配置了ValidationPipe的话还会做参数校验 - 把解析、校验后的结果赋值给
user变量,这个变量只在create函数执行期间存在,函数执行完成后,如果没有其他地方持有对它的引用,就会被JavaScript的垃圾回收机制回收。
2. 和Request对象的关系:原始数据确实存于Request中
你猜的没错!原始的请求body数据确实存储在NestJS底层的Request对象里——如果你用的是默认的Express适配器,就是req.body;如果是Fastify适配器,也是req.body。
@Body()装饰器其实是NestJS提供的语法糖:它帮你跳过了手动从Request对象里取body的步骤,直接把解析好的、类型安全的对象注入到你的参数里。如果你想验证这一点,可以试试在函数里同时注入Request对象:
@Post() @HttpCode(HttpStatus.CREATED) create(@Body() user: IUserBase, @Req() req: Request): Promise<IUser> { console.log(req.body); // 这里会打印和user变量内容一致的原始body数据 return this.usersService.create(user); }
简单来说,user是NestJS帮你从Request对象的body里提取并处理后的局部变量,而原始的body数据确实保存在Request对象中。
内容的提问来源于stack exchange,提问作者user2674150
相关产品推荐
相关产品推荐

