我正在尝试 MikroORM,我喜欢它,但我遇到了一个我无法忍受的情况。
我有一小段代码:
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);
这给了我(console.log 输出)
!* user before User {
email: '[email protected]',
name: 'Username',
verifyToken: null,
verifyTokenCreatedAt: null,
verifiedAt: 2024-10-24T06:07:22.417Z,
accessToken: '80b1b652-2f45-43db-8200-b9d003ad1ddb',
createdAt: 2024-10-24T06:07:22.400Z,
updatedAt: 2024-10-24T06:07:22.417Z,
id: '3eab5128-5549-401d-88f6-98c2ff9f517c'
}
!* user after User {
email: '[email protected]',
name: 'Username',
verifyToken: null,
verifyTokenCreatedAt: null,
verifiedAt: 2024-10-24T06:07:22.417Z,
createdAt: 2024-10-24T06:07:22.400Z,
updatedAt: 2024-10-24T06:07:22.417Z,
id: '3eab5128-5549-401d-88f6-98c2ff9f517c'
}
我的问题是我不明白为什么“用户之后”日志中缺少
accessToken
属性。
我的测试希望看到该属性返回一个 null
值。我错过了什么?
为了完整起见,我的实体定义:
@Entity()
export class User {
[OptionalProps]?: 'createdAt' | 'updatedAt'
@PrimaryKey({type: "string"})
id = crypto.randomUUID()
@Property({type: "string", unique: true})
email: string
@Property({type: "string"})
name: string
@Property({type: "string", nullable: true})
verifyToken?: string
@Property({type: "Date", nullable: true})
verifyTokenCreatedAt?: Date
@Property({type: "Date", nullable: true})
verifiedAt?: Date
@Property({type: "String", nullable: true, index: true})
accessToken?: string
@Property({type: "Date"})
createdAt = new Date();
@Property({type: "Date", onUpdate: () => new Date() })
updatedAt = new Date();
constructor({email, name}: User) {
this.email = email
this.name = name
}
}
和我的初始化:
export const orm = await MikroORM.init({
entities: [User],
dbName: mikroConfig.dbName,
host: mikroConfig.host,
user: mikroConfig.user,
password: mikroConfig.password,
logger: (message: string) => console.debug(message), // defaults to `console.log()`
})
ORM 不会为您将
undefined
转换为 null
,并且在您记录实体时会忽略 undefined
值。从技术上讲,该值是存在的,但一旦序列化此类实体,它就会被省略,因此在 console.log
ging 时打印它并不是很相关。
如果您想查看它(以及以序列化形式/JSON 形式显示它),您可以使用显式
null
,这是目前唯一的方法。为此,您必须调整实体定义以允许 null
值。请注意,这样做后,reflect-metadata 将不再起作用,因为它无法推断任何联合类型,但我看到您已经明确提供了 type
选项。
// entity def
accessToken?: string | null
// usage
user.accessToken = null
如果您想保留类型级别的可选性,这取决于您,
accessToken: string | null
也可以。