我在MongoDB中有一个users
的集合。我需要为每个用户生成一个令牌并将其保存到数据库中:
var crypto = require('crypto');
db.users.find({}).exec(function(users){
users.forEach(function(user){
user.token = crypto.randomBytes(32).toString('hex');
user.save();
});
});
我总是对异步方法感到困惑,只是无法理解它们是如何工作的......所以这段代码不起作用,因为它在save()
调用完成之前就存在了。你会如何使它工作?你会如何等待所有save()
˙calls并打印Done!
来控制?
谢谢!
答案 0 :(得分:2)
Mongoose find
函数返回一个promise,你可以用它来创建链。 Promise.all
生成promises(或者promises和values的混合),遍历所有值并返回在数组中的所有项都满足时满足的promise。
var crypto = require('crypto');
db.users
.find({})
.then(users => {
var ops = users.map(user => {
user.token = crypto.randomBytes(32).toString('hex');
return user.save();
});
return Promise.all(ops);
})
.then(() => console.log('done'))
.catch(err => console.log('error' + err));
});