带有 TypeORM 的 NesteJS - 挂钩和监听器不工作
NesteJS with TypeORM - hooks and listeners not working
解决方案
我的 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()
挂钩应该获取密码,对其进行散列,然后 return 散列密码。
创建新玩家的相关路径放在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执行create/insert操作:
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 请求时,都会创建一个新播放器。但不幸的是 none 的已用钩子 and/or 听众工作。
实例化实体,为其分配属性,然后保存。
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);
解决方案
我的 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()
挂钩应该获取密码,对其进行散列,然后 return 散列密码。
创建新玩家的相关路径放在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执行create/insert操作:
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 请求时,都会创建一个新播放器。但不幸的是 none 的已用钩子 and/or 听众工作。
实例化实体,为其分配属性,然后保存。
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);