未返回 MikroORM 未定义属性

问题描述 投票:0回答:1

我正在尝试 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()`
})
typescript mikro-orm
1个回答
0
投票

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
也可以。

© www.soinside.com 2019 - 2024. All rights reserved.