好吧,我可以在 createUser 中对我的密码进行哈希处理,但是,要更新用户,我需要对这个新传递的密码进行哈希处理,但是当我有 data.senha: senhaHasheada 或 usuarioachar.senha: senhaHasheada 时,我之前无法实现它保存,它说它无效,当我使用 {id, nome, senha, email, idade} = bados 创建一个 const 解构 updateUsuarioDTO 时,它不起作用,因为我需要传递一个 id 参数来搜索用户更新它,如果我有另一个 id: string 参数,它说如果我在第二个参数中有非结构化的dados,则 id 是重复的。
我的身份验证(rabbirtmq)服务(更新用户):
async atualizarUsuario(dados: atualizarUsuarioDTO){
const {id, nome, email, senha, idade} = dados
const usuarioachar = await this.usuarioRepository.findOneBy({id})
if(usuarioachar === null){
throw new NotFoundException('úsuario com id nao achado')
}
const senhaHasheada = await this.hashearSenha(senha)
const usuario = this.usuarioRepository.save({nome, email, senha: senhaHasheada, idade })
console.log(senha)
return usuario
}
我的控制器:
@MessagePattern({ cmd: 'atualizar-usuario'})
async atualizarUsuario(@Ctx() contexto: RmqContext,@Payload() {id, ...dados}: atualizarUsuarioDTO){
const channel = contexto.getChannelRef()
const message = contexto.getMessage()
channel.ack(message)
return this.authService.atualizarUsuario({id, ...dados})
我的createUser(我可以散列密码,我想要类似的东西):
async criarUsuario(dados: CriaUsuarioDTO): Promise<UsuarioEntidade>{
const {id, nome, email, senha, idade } = dados
const achado = await this.acharEmail(email)
if(achado){
throw new ConflictException('Usuario ja existente com esse email')
}
const senhaHasheada = await this.hashearSenha(senha)
const usuarioSalvar = await this.usuarioRepository.save({
id, nome, email, senha: senhaHasheada, idade
})
return usuarioSalvar
}
我的API网关控制器:
@Put('usuario/:id')
async atualizaUsuario(@Param('id') id: string, @Body() data: atualizarUsuarioDTO){
return this.authServico.send(
{
cmd: 'atualizar-usuario'
},
{id, data}
)
}
我的哈希异步函数(hashearSenha):
async hashearSenha(senha: string){
const sal = await bcrypt.genSalt(10)
const hash = bcrypt.hash(senha, sal)
return hash
}
obs:senha这个词是密码。
obs2:当我尝试像dados.senha = senhaHasheda 时,它给出了一个错误:
ERROR [RpcExceptionsHandler] data and salt arguments required
发送到微服务服务器的负载应该是
{ id, data }
,而不是 { id, ...data }
。至于为什么它作为新条目而不是更新返回,我认为这是 TypeORM 正在幕后做的事情。您可以尝试使用 update
方法而不是 save
,或者如果您更喜欢这种方法,可以先通过 id 运行 findOne
。