Я следил за учебником Ben Awad Fullstack и столкнулся с проблемой. Итак, я установил MikroORM и использую базу данных PostgreSQL. Проблема в том, что команда npx mikro-orm migration:create
возвращает следующую ошибку:
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 на uuid и добавить соответствующий параметр объекта в декоратор @PrimaryKey, но ошибка остается прежней. На данный момент я использую только MikroORM и зависимости от ts-node. Заранее спасибо.
Вам нужно добавить эту строку в свой индексный скрипт (вверх):
import 'reflect-metadata';
(и добавьте его в свои зависимости, если у вас его еще нет)
Я действительно исправил это. Похоже, машинописный текст не скомпилировался правильно, поэтому я удалил файл Post.js из папки src, и когда я снова его скомпилировал, он, кажется, работает, как и ожидалось.
Для меня это отсутствовало 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];
Это работает для меня - поместите атрибут типа в каждый столбец.
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
}
Я получил эту ошибку при запуске моего проекта с tsx в разработке. Я снова переключился на ts-node-dev , и ошибка исчезла. Компиляция его в JavaScript с помощью tsc тоже отлично сработает.
Мне пришлось добавить "emitDecoratorMetadata": true
к tsconfig.json
в моем проекте. Я не эксперт по Typescript, но для меня это имеет смысл, поскольку поставщику метаданных на основе отражения по умолчанию нужны метаданные типа для работы, которых, по-видимому, не было бы без этой опции.
Я только что попробовал это, но та же ошибка все еще там, к сожалению.