哈希密码存入对象时出现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
相关产品推荐
相关产品推荐

