使用 mikro-orm 和打字稿创建 class 实例并插入到 postgresql 数据库时出现问题

Issue in creating a class instance using mikro-orm and typescript and inserting into postgresql database

我正在尝试编写代码 React GraphQL TypeScript tutorial

该项目使用 MikroOrm 与 PostgreSQL 数据库进行通信。

目标:创建 post 的实例并将其插入数据库。

目前我在第 19.53 分钟遇到了视频中没有出现的以下错误,我不确定为什么。

Post.ts 文件:

@Entity() //correspond to database table.
export class Post {
    @PrimaryKey()
    id!: number;

    @Property({ type: 'date'}) //denote database column, without it its just a class attribute
    createdAt = new Date();

    @Property({ type: 'date', onUpdate: () => new Date() })
    updatedAt = new Date();

    @Property({type: 'text'})
    title!: string;
}

Index.ts 文件:

const main = async () => {
    const orm = await MikroORM.init(microConfig);
    const post = orm.em.create(Post, {title: "my first post" }); //create instance of post
    await orm.em.persistAndFlush(post); //insert into database
}

Index.ts 中的行向我抛出一个错误:

const post = orm.em.create(Post, {title: "my first post" });
Argument of type '{ title: string; }' is not assignable to parameter of type 'RequiredEntityData<Post>'.
  Type '{ title: string; }' is missing the following properties from type '{ createdAt: EntityDataItem<Date>; updatedAt: EntityDataItem<Date>; title: EntityDataItem<string>;

您需要通过 OptionalProps 符号标记具有初始值设定项的属性,使它们对于 em.create() 方法是可选的。此外,您可以直接指定类型而不是显式 type 选项(推理不适用于 reflect-metadata)。

这是一个应该可以正常工作的实体定义:

@Entity()
export class Post {
    [OptionalProps]?: 'createdAt' | 'updatedAt';

    @PrimaryKey()
    id!: number;

    @Property()
    createdAt: Date = new Date();

    @Property({ onUpdate: () => new Date() })
    updatedAt: Date = new Date();

    @Property({ type: 'text' })
    title!: string;
}

我刚刚偶然发现了这个错误,这就是我解决它的方法。该错误基本上是说您需要在创建参数上设​​置 updatedAtcreatedAt。所以这里的实体应该是:

import { Entity, PrimaryKey, Property } from "@mikro-orm/core";

@Entity()
export class Post {
  @PrimaryKey()
  id!: number;

  @Property()
  createdAt?: Date = new Date();

  @Property({ onUpdate: () => new Date() })
  updatedAt?: Date = new Date();

  @Property()
  title!: string;
}

您需要添加“?”在 createdAtupdatedAt 之后,因此它们被识别为可选属性。