Как сериализовать и десериализовать объект, сохраняя его имя класса в Typeorm - PullRequest
0 голосов
/ 24 ноября 2018

Я новичок в организации событий и использую NestJS с Typeorm.Я использую AggregateRoot из библиотеки '@ nestjs / cqrs'.Эта библиотека нуждается в имени конструктора события, когда она применяет событие.

В любом случае, я думаю, что моя проблема связана с Typeorm.Я не знаю, как указать способ десериализации postgres json.

Я сохраняю свои события в базе данных postgresql, используя следующую модель

@Entity()
export class Event {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  aggregateId: number;

  @Column('json')
  payload: object;

  @Column()
  className: string;
}

Мои события хранятся так:

handle(event: ArticleCreatedEvent) {
  const articleCreatedEvent = new Event();
  articleCreatedEvent.payload = event;
  articleCreatedEvent.aggregateId = event.id;
  const { constructor } = Object.getPrototypeOf(event);
  articleCreatedEvent.className = constructor.name;
  this.EventRepository.save(articleCreatedEvent);
  return;
}

Моя проблема: мне нужно получить ArticleCreatedEvent из БД.Когда я делаю это с помощью EventRepository Typeorm, у меня есть все полезные данные моего события.НО, поскольку тип полезной нагрузки в модели - object, имя конструктора - «объект», а мой AggregateRoot обрабатывает базу событий на основе имени конструктора, я хотел бы, чтобы он был «ArticleCreatedEvent».

Могу ли я указать Typeorm, что конструктор должен быть ArticleCreatedEvent, а затем передать полезную нагрузку?Если нет, знаете ли вы, как сохранить объект в postgres, сохранив прототип объекта (например, сохранив имя конструктора)?

Спасибо!

...