Не удается определить ошибку при сохранении сущностей с помощью TypeORM

#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 не является строго типизированным, используемое вами утверждение типа больше не будет существовать во время выполнения. Смотрите этот пример