如何在RabbitMQ环境下的updateUser中对新密码进行哈希处理?
用户更新密码哈希失败及参数传递问题的解决方案
错误提示翻译:
ERROR [RpcExceptionsHandler] 需要数据和盐参数
1. 修复哈希函数的异步调用问题
bcrypt.hash是异步方法,未添加await会返回Promise对象而非实际哈希值;若传入的senha为undefined,则会触发“需要数据和盐参数”的错误。
修改hashearSenha函数:
async hashearSenha(senha: string){ if (!senha) { throw new BadRequestException('密码不能为空'); } const sal = await bcrypt.genSalt(10); const hash = await bcrypt.hash(senha, sal); // 添加await处理异步 return hash; }
2. 修复API网关的参数传递错误
API网关传递的{id, data}结构嵌套,导致Auth服务无法正确解构senha字段,需将参数合并为atualizarUsuarioDTO的扁平结构。
修改API网关的atualizaUsuario方法:
@Put('usuario/:id') async atualizaUsuario(@Param('id') id: string, @Body() data: atualizarUsuarioDTO){ return this.authServico.send( { cmd: 'atualizar-usuario' }, { id, ...data } // 展开data,合并id到目标结构 ); }
3. 简化Auth服务Controller的参数处理
原代码中解构后重新合并的操作冗余,直接传递完整Payload即可:
@MessagePattern({ cmd: 'atualizar-usuario'}) async atualizarUsuario(@Ctx() contexto: RmqContext, @Payload() dados: atualizarUsuarioDTO){ const channel = contexto.getChannelRef(); const message = contexto.getMessage(); channel.ack(message); return this.authService.atualizarUsuario(dados); }
4. 修复更新用户的逻辑问题
- 仅当传入新密码时才执行哈希操作,避免空值传入哈希函数
- 合并原有用户数据,确保仅修改传入的字段,同时携带ID触发更新而非新建
修改Auth服务的atualizarUsuario方法:
async atualizarUsuario(dados: atualizarUsuarioDTO){ const {id, nome, email, senha, idade} = dados; const usuarioachar = await this.usuarioRepository.findOneBy({id}); if(!usuarioachar){ throw new NotFoundException('未找到该ID的用户'); } // 保留原密码,仅传入新密码时重新哈希 let senhaHasheada = usuarioachar.senha; if(senha){ senhaHasheada = await this.hashearSenha(senha); } // 合并原有数据,更新指定字段 const usuario = await this.usuarioRepository.save({ ...usuarioachar, nome: nome || usuarioachar.nome, email: email || usuarioachar.email, senha: senhaHasheada, idade: idade || usuarioachar.idade }); return usuario; }
内容的提问来源于stack exchange,提问作者user22358808
相关产品推荐
相关产品推荐

