我正在尝试向节点服务器发送多个条目,以便更新数据库中的每个人。
我认为一种方法是通过他们独特的ID循环每个人,并根据此保存更新的信息。
但是,在Employee.findById函数中,我无法访问[i]
的值,因此无法获得相关员工。尝试修改2个员工var i
时运行此行代码将输出;
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)
没有输出与外部日志相同的数字?
另外,我不确定我采取的方法是否正确这样做?
感谢您的任何建议!
答案 0 :(得分:2)
当调用/edit
路由时,for循环运行,注销"outside"
语句并为Employee.findById
中的每个元素调用req.body
方法,这将执行并在查找操作完成后调用"inside"
控制台日志语句 。 请注意,这是一个异步操作。
在i
调用的回调中,Employee.findById
变量不会发生变化。这是因为for循环已经将i
增加到req.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
});
});
答案 1 :(得分: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