2016-11-28 11 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