使用PATCH修改node / mongoose的多个条目?

时间:2016-11-28 10:21:26

标签: node.js mongodb 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 个答案:

答案 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

的文档