[英]Using PATCH to modify multiple entries with node/mongoose?
我正在尝试向我的节点服务器发送多个条目,以便更新数据库中的每个人。
我认为一种方法是通过每个人的唯一ID遍历每个人,并基于此保存更新的信息。
但是,在Employee.findById函数内部,我无法访问[i]
的值,因此无法获取相关员工。 尝试修改2 Employees 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)
与外部日志输出的数字不同?
另外,我不确定我采用的方法是否是正确的方法?
感谢您的任何建议!
当你的/edit
路线被调用,用于循环运行,将注销"outside"
声明并调用Employee.findById
方法中的每个元素req.body
,将执行并调用"inside"
控制台日志语句时,发现操作已完成 。 请注意,这是一个异步操作。
i
变量在Employee.findById
调用的回调内不会更改。 这是因为for循环已将i
递增到req.body
的元素req.body
。
这样,在保存员工文档时,您将无法判断所有操作是否已完成或是否发生错误,并将此信息转发给客户端。
我建议使用异步或其他流控制库。
您使用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
});
});
这是因为函数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
文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.