NestJs: Как получить доступ к базе данных в прослушивателях сущностей? - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть @BeforeInsert() слушатель в моей Post сущности. Предполагается, что перед вставкой слушатель создает уникальный столбец для столбца slug.

Например:

export class Post extends BaseEntity {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    title: string

    @Column()
    slug: string

    @BeforeInsert()
    private updateSlug() {
        this.slug = slugify(this.title)
        // I will need to access the database to check whether the same slug has existsed already or not. 
        // How do I access the database in this listener method?
    }
}

Поскольку столбец slug должен быть уникальным, мне придется проверить в базе данных, чтобы узнать, существует ли такой же слаг уже. Если слаг уже существует, мне нужно добавить число за слагом, например hello-word-1.

Однако для этого мне потребуется доступ к репозиторию Post сущности в классе сущностей Post, прежде чем я смогу получить доступ к базе данных. Но я не понимаю, как я могу внедрить репозиторий в свой класс сущностей Post для доступа к базе данных для этой цели.

Как мне подойти к этой проблеме?

1 Ответ

1 голос
/ 15 апреля 2019

Насколько я знаю, невозможно использовать внедрение зависимостей в сущностях типа, так как они не создаются nest. Однако вместо этого вы можете использовать EntitySubscriber , который может вводить зависимости. Смотрите решение этой проблемы Github :

import { Injectable } from '@nestjs/common';
import { InjectConnection, InjectRepository } from '@nestjs/typeorm';
import { Connection, EntitySubscriberInterface, InsertEvent, Repository } from 'typeorm';
import { Post } from '../models';

@Injectable()
export class PostSubscriber implements EntitySubscriberInterface {

  constructor(
    @InjectConnection() readonly connection: Connection,
    // Inject your repository here
    @InjectRepository(Photo) private readonly postRepository: Repository<Post>,
  ) {
    connection.subscribers.push(this);
  }

  listenTo() {
    return Post;
  }

  beforeInsert(event: InsertEvent<Post>) {
    // called before insert
  };

}
...