Tengo que recibir una matriz de Objetos y actualizar cada uno de ellos, por su _id , en mi base de datos MongoDB.
Tenía un método que insertaría un objeto cada vez que hiciera un HTTP PUT, así:
router.post('/bet', function(req, res){ Bet.update(req.body) .then(dados => res.status(201).jsonp({dados: dados})) .catch(e => res.status(500).jsonp({error: 'erro'})) }) Donde update() se define como:
module.exports.update = function(d){ return Bet.findByIdAndUpdate({_id: d._id}, d, {new: true}) }Esto funciona bien cuando necesito actualizar una sola apuesta, pero para poder actualizar varias, creé esto:
router.put('/bets', function(req, res){ req.body.forEach((obj) =>{ Bet.update(obj) .then(dados => res.status(201).jsonp({dados: dados})) .catch(e => res.status(500).jsonp({error: e})) }) })¿Es esto correcto? Estoy teniendo muchos problemas, que sinceramente creo que provienen de hacer muchas solicitudes diferentes al mismo tiempo, pero me gustaría comenzar garantizando que este primer paso se realiza correctamente.
No, es probable que esta no sea la forma correcta. Está enviando una respuesta al cliente en el momento en que se realiza una sola actualización.
Agregaría un método updateMany así:
module.exports.updateMany = function(arr){ return Promise.all(arr.map(d => Bet.findByIdAndUpdate(d._id, d, {new: true}))) } El método usa Array#map() para crear una matriz de Promesas, que se resuelven una vez que se realiza la actualización y luego usa Promise.all() para brindar la capacidad de esperar a que se realicen todas las promesas.
Se resuelve una vez que se realizan todas las actualizaciones o se rechaza cuando falla alguna actualización.
(Nota: no tiene que especificar un objeto de consulta como {__id:id} para findByIdAndUpdate() )
Luego puede igualar eso desde su ruta de apuestas:
router.put('/bets', function(req, res){ Bet.updateMany(req.body) .then(promiseArray => res.status(201).jsonp({dados: promiseArray})) .catch(e => res.status(500).jsonp({error: e})) })