#nestjs #typeorm
Вопрос:
Я создал NestJS и использовал TypeORM для СУБД(я использовал postgres в своем проекте).
Post
это @Entity
класс, PostRepository
это Repository
класс для Post
.
Я пытался создать OnModuleInit
службу для инициализации некоторых данных.
@Injectable()
export class PostsDataInitializer implements OnModuleInit {
private data: Post[] = [
{
title: 'Generate a NestJS project',
content: 'content',
},
{
title: 'Create GrapQL APIs',
content: 'content',
},
{
title: 'Connect to Postgres via TypeORM',
content: 'content',
},
];
constructor(private readonly postRepository: PostRepository) {}
async onModuleInit(): Promise<void> {
await this.postRepository.manager.transaction(async (manager) => {
// NOTE: you must perform all database operations using the given manager instance
// it's a special instance of EntityManager working with this transaction
// and don't forget to await things here
await manager.delete(Post, {});
console.log('deleted: {} ');
this.data.forEach(async (d) => await manager.save(d as Post));
const savedPosts = await manager.find<Post>(Post);
savedPosts.forEach((p) => {
console.log('saved: {}', p);
});
});
}
}
При запуске приложения я получил следующую ошибку.
CannotDetermineEntityError: Cannot save, given value must be instance of entity class, instead object literal is given. Or you must specify an entity target to method call.
Но вышесказанное было лишь примером save
. Post
Ответ №1:
Я думаю, что это в значительной степени то, о чем говорит ошибка. Вы не можете передавать литеральные объекты в .save
private data = [
{
title: 'Generate a NestJS project',
content: 'content',
},
{
title: 'Create GrapQL APIs',
content: 'content',
},
{
title: 'Connect to Postgres via TypeORM',
content: 'content',
},
].map(data => {
const post = new Post();
Object.assign(post, data);
return post;
})
вышесказанное может решить эту проблему.
Комментарии:
1. Раньше я
d as Post
бросал его наPost
то , почему это не работает. В чем разница между объектным литералом и экземпляром в typescript?2. разница зависит не от ts , а от js.
new Foo()
объекты будутinstance of Foo
, в то время как буквальный объект, который просто имеет формуFoo
, не будет. И TypeORM ожидает работы с экземплярамиFoo
3. кстати, типизация на строго типизированных языках позволяет нам преобразовывать типы. Поскольку javascript не является строго типизированным, используемое вами утверждение типа больше не будет существовать во время выполнения. Смотрите этот пример