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

哈希密码存入对象时出现Promise { pending }问题求助

问题原因与解决方案

出现Promise { pending }是因为你直接把bcrypt的哈希Promise对象赋值给了Password字段,而非等待Promise完成后取到实际的哈希值。即便用了async/await或then,大概率是在错误的上下文里使用,比如非async函数内用await,或是then回调里没正确更新对象。

常见错误场景与修正

错误写法1:非async函数中直接使用await

// 错误:await仅能在async函数内使用
const users = [
  { username: 'user1', password: bcrypt.hash('123456', 10) }, // 直接赋值Promise
  { username: 'user2', password: await bcrypt.hash('123456', 10) } // 非async函数内用await报错
];

错误写法2:使用then但未正确更新对象

const user = { username: 'user1' };
user.password = bcrypt.hash('123456', 10).then(hash => hash);
// 此处user.password仍是Promise,then返回的Promise未被正确处理

正确实现方式

方式1:用async/await批量处理列表

const bcrypt = require('bcrypt');

// 必须在async函数内使用await
async function createUserList() {
  const rawUsers = [
    { username: 'user1', rawPassword: '123456' },
    { username: 'user2', rawPassword: 'abcdef' }
  ];

  // 用Promise.all等待所有哈希操作完成
  const users = await Promise.all(rawUsers.map(async user => {
    const hash = await bcrypt.hash(user.rawPassword, 10);
    return {
      username: user.username,
      password: hash // 赋值实际哈希值,而非Promise
    };
  }));

  console.log(users); // 此时password为哈希后的字符串
  return users;
}

// 调用async函数
createUserList();

方式2:使用then链式处理

const bcrypt = require('bcrypt');

const rawUsers = [
  { username: 'user1', rawPassword: '123456' },
  { username: 'user2', rawPassword: 'abcdef' }
];

Promise.all(rawUsers.map(user => 
  bcrypt.hash(user.rawPassword, 10).then(hash => ({
    username: user.username,
    password: hash
  }))
)).then(users => {
  console.log(users); // 此处users为处理完成的列表
});

关键注意点

  • bcrypt的hash是异步方法,返回Promise,必须等待其resolve才能拿到哈希值;若要用同步版本,可使用hashSync(但不推荐在主线程使用,会阻塞进程)。
  • 处理多个对象时,必须用Promise.all等待所有异步操作完成,否则列表内对象的Password字段仍会是未完成的Promise。
  • await仅能在async标记的函数内部使用,全局作用域下直接使用会报错(Node.js 14+支持模块顶级await)。

内容的提问来源于stack exchange,提问作者Ali Haider Sultani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:07:36