2016-11-28 6 views
0

データベース内のすべての人物を更新するために、ノードサーバーに複数のエントリを送信しようとしています。PATCHを使用してノード/ mongooseで複数のエントリを変更しますか?

私はそれを行う方法は、一意のIDを介して各人をループし、これに基づいて更新情報を保存することだと思った。

しかし、Employee.findById関数内では、私は[i]の値にアクセスすることができないので、関連する従業員を取得できません。 2人の従業員var iを変更しようとしているときに、このコード行を実行すると出力されます。

enter image description here

router.patch('/edit', function(req, res, next) { 

    for (var i = 0; i < req.body.length; i++) { 

     console.log("outside " + i) 

     Employee.findById(req.body[i].employeeId, function(err, employee) { 

      console.log("inside " + i) 

     /* 
      employee = new Employee({ 
       name: req.body[i].name, 
      }) 

      employee.save(); 
     */ 


     }) 
    } 

}) 

console.log("inside " + i)が外にログとして同じ番号を出力していない私はなぜわかりませんか?

また、私が取っているアプローチがこれを行う正しい方法であるかどうかはわかりません。

アドバイスありがとうございます!

答えて

2

のドキュメントを読むことをお勧め、ループの実行のために、"outside"文をログアウト各要素のEmployee.findByIdメソッドをreq.bodyに呼び出します。これは、検索操作が完了したときに"inside"コンソールログステートメントを実行して呼び出します。です。 これは非同期操作であることに注意してください。

i変数は、Employee.findByIdコールのコールバック内で変更されません。これは、forループが既にの要素の数に、iをインクリメントしているためです。

こうすることで、従業員文書を保存している間にすべての操作が完了したかエラーが発生したかどうかを知ることができず、この情報をクライアントの応答に転送できます。

asyncまたは別のフローコントロールライブラリを使用することをお勧めします。 asyncを使用して

あなたの例:

router.patch('/edit', function(req, res, next) { 
    async.each(req.body, function(obj, cb) { 
     Employee.findById(obj.employeeId, function(err, employee) { 
      if (err) { 
       return cb(err); 
      } 
      employee = new Employee({name: obj.name}); 
      employee.save(cb); 
     }); 
    }, function (err) { 
     // any errors from callback will be handled here 
     // inform you user in the response or whatever 
    }); 
}); 
+0

ありがとう!私の場合、新しい従業員の作成は既存のものを変更しなければならないので注意してください。コードを動作させるために、単にそのコードを 'employee.name = obj.name'に置き換えなければなりませんでした。 (もちろん、これは私の元の質問の一部ではありませんでしたが、ちょうどそれが他の人を助けるかもしれない場合に備えて追加すると思っていました) – alexc

1

機能がfindById()であるのはですので、非同期です。ループの反復は、findById()がクエリを終了するのを待機しません。 lib Asyncを使用するようにこの問題を修正することをお勧めします。 これは、非同期で作業を行い、応答を待つ便利な方法を提供しています。 あなたのケースではそのようなことは、問題を解決することができます

async.each(req.body, function (value, callback) { 
    Employee.findById(value.employeeId, function(err, employee) { 
     employee = new Employee({ 
      name: value.name, 
     }) 
     // The callback indicate that this iteration is terminated. 
     employee.save(callback); 
    }); 
}, function (err) { 
    // When all callback() are triggered we pass here, and this tells we finished all operation. 
}); 

私はあなたの/editルートが呼び出されると、あなたが慎重にeach

+0

asyncsは 'eachOf'とそのエイリアスが'コレクションを反復forEachOf'。コード例は、req.bodyが配列であることを示しています。 – DevDig

+0

ええ、ありがとうございます。私は自分の答えを編集しました。 – Zagonine

+0

'employee.save()'も非同期操作であることに注意してください。 – DevDig

関連する問題