Как решить «Пожалуйста, укажите атрибут ‘type’ или ‘entity’ в EntityName.id » ошибка при создании миграции в MikroORM?

#node.js #typescript #postgresql #mikro-orm

#node.js #typescript #postgresql #микро-orm

Вопрос:

Я следил за руководством Бена Авада по Fullstack и столкнулся с проблемой. Итак, я установил MikroORM и использую базу данных PostgreSQL. Проблема в том, что npx mikro-orm migration:create команда возвращает следующую ошибку:

 Error: Please provide either 'type' or 'entity' attribute in Post.id
    at ReflectMetadataProvider.initPropertyType (F:Web DevelopmentRedditClonenode_modules@mikro-ormcoremetadataReflectMetadataProvider.js:14:19)
    at F:Web DevelopmentRedditClonenode_modules@mikro-ormcoremetadataReflectMetadataProvider.js:9:54
    at ReflectMetadataProvider.initProperties (F:Web DevelopmentRedditClonenode_modules@mikro-ormcoremetadataMetadataProvider.js:26:23)
    at ReflectMetadataProvider.loadEntityMetadata (F:Web DevelopmentRedditClonenode_modules@mikro-ormcoremetadataReflectMetadataProvider.js:9:20)
    at MetadataDiscovery.discoverEntity (F:Web DevelopmentRedditClonenode_modules@mikro-ormcoremetadataMetadataDiscovery.js:182:41)
    at MetadataDiscovery.discoverReferences (F:Web DevelopmentRedditClonenode_modules@mikro-ormcoremetadataMetadataDiscovery.js:131:24)
    at MetadataDiscovery.findEntities (F:Web DevelopmentRedditClonenode_modules@mikro-ormcoremetadataMetadataDiscovery.js:71:20)
    at MetadataDiscovery.discover (F:Web DevelopmentRedditClonenode_modules@mikro-ormcoremetadataMetadataDiscovery.js:34:9)
    at Function.init (F:Web DevelopmentRedditClonenode_modules@mikro-ormcoreMikroORM.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 на uuid и добавить соответствующий параметр объекта в декоратор @PrimaryKey, но ошибка остается прежней.
На данный момент я использую только зависимости MikroORM и ts-node.
Заранее спасибо.

Ответ №1:

Для меня это отсутствовало metadataProvider в конфигурационном файле ORM:

 // 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];
 

Ответ №2:

Это работает для меня — поместите атрибут type в каждый столбец.

 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
} 

Комментарии:

1. Это сработало для меня. Спасибо!

Ответ №3:

Вам нужно добавить эту строку в ваш индексный скрипт (вверху):

 import 'reflect-metadata';
 

(и добавьте его в свои зависимости, если у вас его там еще нет)

Комментарии:

1. Я только что попробовал это, но, к сожалению, та же ошибка все еще существует.

Ответ №4:

Я действительно исправил это. Похоже, что typescript не скомпилировался правильно, поэтому я удалил Post.js файл из папки src, и когда я скомпилировал его снова, кажется, что он работает так, как ожидалось.