在 MikroORM 中创建迁移时如何解决 "Please provide either 'type' or 'entity' attribute in EntityName.id" 错误?

How to resolve "Please provide either 'type' or 'entity' attribute in EntityName.id" error when creating migration in MikroORM?

我一直在关注 Ben Awad Fullstack 教程并 运行 遇到了一个问题。所以,我已经安装了 MikroORM 并正在使用 PostgreSQL 数据库。问题是 npx mikro-orm migration:create 命令 returns 出现以下错误:

Error: Please provide either 'type' or 'entity' attribute in Post.id
    at ReflectMetadataProvider.initPropertyType (F:\Web Development\RedditClone\node_modules\@mikro-orm\core\metadata\ReflectMetadataProvider.js:14:19)
    at F:\Web Development\RedditClone\node_modules\@mikro-orm\core\metadata\ReflectMetadataProvider.js:9:54
    at ReflectMetadataProvider.initProperties (F:\Web Development\RedditClone\node_modules\@mikro-orm\core\metadata\MetadataProvider.js:26:23)
    at ReflectMetadataProvider.loadEntityMetadata (F:\Web Development\RedditClone\node_modules\@mikro-orm\core\metadata\ReflectMetadataProvider.js:9:20)
    at MetadataDiscovery.discoverEntity (F:\Web Development\RedditClone\node_modules\@mikro-orm\core\metadata\MetadataDiscovery.js:182:41)
    at MetadataDiscovery.discoverReferences (F:\Web Development\RedditClone\node_modules\@mikro-orm\core\metadata\MetadataDiscovery.js:131:24)
    at MetadataDiscovery.findEntities (F:\Web Development\RedditClone\node_modules\@mikro-orm\core\metadata\MetadataDiscovery.js:71:20)
    at MetadataDiscovery.discover (F:\Web Development\RedditClone\node_modules\@mikro-orm\core\metadata\MetadataDiscovery.js:34:9)
    at Function.init (F:\Web Development\RedditClone\node_modules\@mikro-orm\core\MikroORM.js:40:24)

我创建了 Post 个如下所示的实体:

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

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

    @Property()
    createdAt = new Date();

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

    @Property()
    title!: string;
}

我还为 MikroORM 创建了配置文件,如下所示:

import { __prod__ } from "./constants";
import { Post } from "./entities/Post";
import { MikroORM } from "@mikro-orm/core";
import path from "path";

export default {
    migrations: {
        path: path.join(__dirname, "./migrations"),
        pattern: /^[\w-]+\d+\.[tj]s$/,
    },
    entities: [Post],
    dbName: "redditclone",
    type: "postgresql",
    debug: !__prod__,
    user: "postgres",
    password: "postgres",
} as Parameters<typeof MikroORM.init>[0];

所有内容都放在 index.ts 脚本中:

import { MikroORM } from "@mikro-orm/core";
import { __prod__ } from "./constants";
import { Post } from "./entities/Post";
import microConfig from "./mikro-orm.config";

const main = async () => {
    const orm = await MikroORM.init(microConfig);

    const post = orm.em.create(Post, { title: "my first post" });
    await orm.em.persistAndFlush(post);
};

main();

我试过将 Post 实体 id 更改为 uuid 并将相应的对象参数添加到 @PrimaryKey 装饰器,但错误保持不变。 目前我只使用 MikroORM 和 ts-node 依赖项。 提前致谢。

您需要将此行添加到您的索引脚本(到顶部):

import 'reflect-metadata';

(如果您还没有它,请将其添加到您的依赖项中)

我已经修好了。打字稿似乎没有正确编译,所以我从 src 文件夹中删除了 Post.js 文件,当我再次编译它时,它似乎按预期工作。

对我来说,ORM 的配置文件中缺少 metadataProvider

// orm.config.ts

import { MikroORM } from '@mikro-orm/core';
import { TsMorphMetadataProvider } from '@mikro-orm/reflection';

export default {
    // ...
    metadataProvider: TsMorphMetadataProvider
    // ...
} as Parameters <typeof MikroORM.init> [0];

这对我有用 - 将类型属性添加到每一列。

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

@Entity()
export class Post {
  @PrimaryKey({ type: 'number' })
  id!: number

  @Property({ type: 'date' })
  createdAt: Date = new Date()

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

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