下記のコードは、蛇行ORMを使用してDBクエリを作成し、レスポンスを送信しています。しかし、実行フローが奇妙です。マップ関数のコードは、マップ関数が実行を終了する前に実行されています。 「私は地図の外にあります」の前にコンソールに「私は地図の内側にあります」と表示されています。私はそれがプロミスまたは非同期/待つことを使用してこれを解決することができると思う。私は以下のPromise.all()を使ってみましたが、動作しません。応答は常に空の配列です。このような問題を解決する方法の例を挙げることができれば、感謝しています。array.map()内のセイル・ウォーターラインORMクエリー
allMembers: (req, res) => {
const projectId = req.params.id;
ProjectMembers.find({projectId: projectId}).exec((err, members) => {
if(err) res.serverError("bad request!");
if(members.length === 0) res.notFound({message: "No members are found for this project!"});
let membersInfo = [];
let promise = Promise.all(members.map(m => {
User.findOne({id: m.userId}).exec((err, user) => {
if(err) membersInfo.push({name: null, userId: null, email:null,rate:null, error: 'Internal error!'})
else if(!user) membersInfo.push({name: null, userId: null, email:null,rate:null, error: 'No user found'})
else membersInfo.push({name: user.name, userId: user.id, rate: m.rate, error: null})
console.log("i am inside of map");
})
}));
console.log("I am outsie of map")
promise.then((resolve) => {return res.ok({members: membersInfo})});
}
良い。選択したデータベースに応じて、個々のfondOnesではなく、ユーザーIDにOR条件を持つ1つの大きな 'User.find'を実行できます。 –
@ManuelReilそれは私が取っていたアプローチであり、水線は間違いなく基礎となるデータベースでそれを行うことができます。私はちょうど合理的で作業に近いOPのロジックに近づけようとしていました。 – arbuthnott