【问题标题】:Save audit for an entity using nestjs and typeorm使用 nestjs 和 typeorm 保存实体的审计
【发布时间】:2020-09-18 20:26:32
【问题描述】:

我有一个实体 Audit 如下所示,在带有 mongodb 的 typeorm 的 Nestjs 应用程序中:

@Entity()
export class Audit {

  @Column()
  createdBy: string;

  @BeforeInsert()
  setAudit() {
    this.createdBy = ???
  }
}

@Entity()
export class Post extends Audit {

  @Column()
  title: string;

  ...
}

我的其他实体扩展 Audit,在我的应用程序中我使用 jwt 来验证用户。

问题是,当我想保存一个实体时,我不知道如何使用 @BeforeInsert 钩子设置 createdBy...

我知道我们有用户请求,但我不知道将用户带入setAudit 方法的正确方法是什么?

【问题讨论】:

    标签: javascript nestjs typeorm


    【解决方案1】:

    您不能直接从 TypeORM 实体内部访问请求,因为它们位于不同的上下文中。相反,您可以通过服务填写 createdBy 字段。

    @Injectable()
    class DataService {
    // ...
    
       async create({ request, user }): Promise<any> {
        await this.repository.create({...request.body, createdBy: user.id });
       }
    
    // ...
    }

    另一种解决方案是创建一个适用于每个实体的通用服务,并且在该服务中您可以填充 createdBy 属性。

    /*
     * DataService
     ? Service to be able to fetch any kind of TypeORM entity from the controllers
     ? or another services.
    */
    @Injectable()
    export class DataService {
        
        /*
         * _.getRepository
         ? Method to get a repository by having only the type of an entity.
         * @param type The type of the entity
         * @returns a repository of the specified entity.
        */
        private getRepository<T>(type: new () => T) {
            return getRepository(type)
        }
        
        /*
         * _.save
         ? A method to save an entity regarding its entity type.
         * @param type the type of the entity
         * @param model the model to save. It should have an ID.
         * @param user the user creating this entity
         * @returns a DeepPartial object representing the edited or created object.
        */
        public save<T extends Audit>(type: new () => T, model: DeepPartial<T>, user: User): Promise<DeepPartial<T> & T> {
            const repository: Repository<T> = this.getRepository(type);
            return repository.save({...model, createdBy: user.id});
        }
    
       
    }

    然后,你将能够做这样的事情......

    // ... 
    
    @Post('create')
    @UseInterceptor(FillUser)
    public async create(@Body() body:any, @Req() request:any) {
      const { user } = request.session.user // <--- Just for example. 
      return await this.service.create(Post, body, user)
    }
    
    // ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-05
      • 2019-04-03
      • 2021-11-27
      • 2020-08-29
      • 2019-11-13
      • 2012-08-10
      • 2021-04-23
      • 2022-07-24
      相关资源
      最近更新 更多