Mikro ORM虚拟属性isMuted在控制器日志缺失但返回后存在的问题
问题描述
我搭建了如下NestJS路由:
@Get(':id') async getUserInfo(@Param('id') id: string) { const res = await this.userService.findOneByField(id); console.log(res); return res; }
使用的服务代码:
findOneByField(args) { return this.em.findOneOrFail(User, args); }
对应的User实体:
@Entity() export class User { @PrimaryKey({ type: 'uuid', defaultRaw: 'uuid_generate_v4()' }) id: string; @OneToOne(() => MutedUser, (mutedUser) => mutedUser.user) mutedUser!: MutedUser; @Property({ persist: false }) get isMuted() { return !!this.mutedUser; } }
现在在控制器中打印res时,isMuted虚拟属性不存在,但将res返回至Postman时该属性却存在。请问这是Mikro ORM的正常行为,还是哪里出现了问题?
解答
这是Mikro ORM的正常行为,具体原因如下:
- Mikro ORM返回的实体实例是代理对象,默认情况下
console.log只会打印实体的原始数据库字段(即映射到表列的属性),不会显示虚拟属性、getter方法这类非持久化的属性。 - 当你将实体返回给Postman时,NestJS会自动调用
JSON.stringify()处理响应,这个过程会触发对象的所有getter方法,包括你定义的isMuted,所以该属性会出现在返回的JSON中。
如果想在控制台看到isMuted属性,可以通过以下两种方式:
- 手动调用
JSON.stringify(res)后再打印,触发getter:console.log(JSON.stringify(res)) - 使用Mikro ORM提供的
serialize()方法:console.log(this.em.serialize(res)),该方法会按照实体定义序列化出包含虚拟属性的对象
内容的提问来源于stack exchange,提问作者Bowis
相关产品推荐
相关产品推荐

