2016-05-07 1 views
1

私はusersのコレクションをMongoDBに持っています。私は、各ユーザーのトークンを生成し、データベースに保存する必要があります。NodeJsで複数のMongoドキュメントを手動で更新するには?

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()コールを待ってDone!をコンソールに印刷するのですか?

ありがとうございます!

答えて

2

Mongoose find関数は、約束を返します、あなたはチェーンを作成するために使用することができます。 Promise.allは約束(または約束と値の組み合わせ)を生成し、すべての値を反復し、配列内のすべての項目が満たされたときに実行される約束を返します。

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)); 
}); 
+0

「=>」とはどういう意味ですか?私はすぐにあなたのソリューションを試してみます。 – papaiatis

+0

'=>'は[ES6 arrow function syntax](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions)を意味します。 node.jsバージョン<4を使用する場合は、代わりに通常の 'functions'を使用してください。 – alexmac

+0

ありがとう!完璧に動作します。 – papaiatis

関連する問題