#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, и когда я скомпилировал его снова, кажется, что он работает так, как ожидалось.