You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:29:58