MikroORM设置属性为undefined后不返回问题咨询
MikroORM中设置属性为undefined后属性消失的原因分析
现象回顾
执行以下代码后,控制台输出显示user.accessToken被设置为undefined后直接从输出中消失,但预期该属性应返回null值:
const user = await appCtx.em.findOne(User, {email, accessToken}) if (!user) { return } console.log('!* user before', user); user.accessToken = undefined console.log('!* user after', user);
原因解析
- MikroORM对
undefined和null的语义区分
MikroORM严格遵循TypeScript中两者的语义差异:
undefined被解释为「属性不存在/未设置」,对于标记为nullable: true的可选属性,赋值undefined会让MikroORM取消对该属性的变更跟踪,序列化时会隐藏该属性。null被解释为「属性存在但无值」,赋值null会触发MikroORM将对应数据库字段更新为null,序列化时也会保留该属性并显示为null。
- 实体属性配置的影响
你的User实体中accessToken被定义为可选属性(带?),且配置了nullable: true:
@Property({type: "String", nullable: true, index: true}) accessToken?: string
这类可选nullable属性,当赋值undefined时,MikroORM会将其视为「恢复到未初始化状态」,因此在控制台输出(实体序列化结果)中会移除该属性。
解决方法
如果需要让accessToken显示为null并同步到数据库,直接赋值null即可:
user.accessToken = null;
内容的提问来源于stack exchange,提问作者Whyhankee
相关产品推荐
相关产品推荐

