【问题标题】:NesteJS with TypeORM - hooks and listeners not working带有 TypeORM 的 NesteJS - 钩子和侦听器不起作用
【发布时间】:2022-01-15 14:18:01
【问题描述】:

解决方案

在我的create 函数player.service.ts 下面发布的解决方案现在看起来像这样:

async create(createPlayerDto: CreatePlayerDto): Promise<Player> {
  const newPlayer = this.playerRepository.create(createPlayerDto);
  return await this.playerRepository.save(newPlayer);
}

我的 player.entity.ts 中的钩子:

@BeforeInsert()
async hashPassword() {
  console.log('Hash password!');
  this.password = await bcrypt.hash(this.password, this.saltOrRounds);
}

问题

对于我的 NestJS 项目,我创建了一个 Player 实体 (player.entity.ts),它具有以下列和一个钩子。我已经通过 TypeORM 包连接了一个 MySQL8.0 数据库。

import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  CreateDateColumn,
  UpdateDateColumn,
  BeforeInsert,
} from 'typeorm';

import * as bcrypt from 'bcrypt';

@Entity({ name: 'players' })
export class Player {
  readonly saltOrRounds = 10;

  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    type: 'varchar',
    unique: true,
  })
  username: string;

  @Column()
  password: string;

  @Column({
    unique: true,
    type: 'varchar',
  })
  email: string;

  @CreateDateColumn({
    name: 'created_at',
    type: 'datetime',
  })
  created_at: 'datetime';

  @UpdateDateColumn({
    name: 'updated_at',
    type: 'datetime',
  })
  updated_at: 'datetime';

  @BeforeInsert()
  async hashPassword() {
    return (
      this.password && (await bcrypt.hash(this.password, this.saltOrRounds))
    );
  }
}

如您所见,@BeforeInsert() 挂钩应该获取密码,对其进行哈希处理,然后返回哈希密码。

创建新玩家的相关路线放在players.controller.ts内:

import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common';
import { PlayersService } from './players.service';
import { CreatePlayerDto } from './dto/create-player.dto';
import { Player } from './interfaces/player.interface';

@Controller('players')
export class PlayersController {
  constructor(private playerService: PlayersService) {}

  @Post()
  async create(@Body() createPlayerDto: CreatePlayerDto) {
    return this.playerService.create(createPlayerDto);
  }
}

控制器使用player.service.ts 并使用EntityManager 执行创建/插入操作:

import { Injectable } from '@nestjs/common';
import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
import { Player } from './entities/player.entity';
import { EntityManager, Repository } from 'typeorm';
import { CreatePlayerDto } from './dto/create-player.dto';

@Injectable()
export class PlayersService {
  constructor(
    @InjectEntityManager()
    private entityManager: EntityManager,
    @InjectRepository(Player)
    private playerRepository: Repository<Player>,
  ) {}

  async create(createPlayerDto: CreatePlayerDto): Promise<Player> {
    return this.entityManager.save(Player, createPlayerDto);
  }
}

我也尝试使用 Repository 获得相同的结果。每次我向/create 端点发出 POST 请求时,都会创建一个新播放器。但不幸的是,使用的钩子和/或侦听器都不起作用。

【问题讨论】:

    标签: nestjs typeorm


    【解决方案1】:

    实例化实体,为其分配属性,然后保存。

    async create(attributes: DeepPartial<T>) {
        const playerEntity = Object.assign(new Player(), attributes);
        return this.repository.save(playerEntity);
    }
    

    或者您可以在存储库上使用create 方法,然后保存它。

    const record = playerRepository.create(attributes);
    await playerRepository.save(record);
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多