You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:15:32