2016-11-28 37 views
0

我試圖發送我的節點服務器多個條目,以更新數據庫內的每個人。使用PATCH修改節點/貓鼬的多個條目?

我認爲這樣做的一種方式是循環每個人通過他們獨特的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

的文檔當你的/edit路線被調用,用於循環運行,將註銷"outside"聲明併爲req.body中的每個元素調用Employee.findById方法,當查找操作完成時,它將執行並調用"inside"控制檯日誌語句請注意,這是一個異步操作。

i變量不會在Employee.findById調用的回調中發生變化。這是因爲for循環已經增加了ireq.body中的元素數量。

通過這樣做,在保存員工文檔並將此信息轉發給客戶端時,您將無法判斷是否所有操作都已完成或出現錯誤。

我建議使用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. 
}); 

我建議你仔細閱讀each

+0

異步操作'eachOf'和它的別名'forEachOf'迭代集合。代碼示例顯示req.body是一個數組。 – DevDig

+0

是的,你寫,謝謝。我編輯了我的答案。 – Zagonine

+0

請注意,'employee.save()'也是一個異步操作。 – DevDig