Soy bastante nuevo en nodejs y estoy haciendo un desafío de desarrollador de pila completa de devchallenges.io (Shoppingify). A continuación, intento aumentar el valor de la cantidad en función de si el usuario hace clic para aumentar o disminuir la cantidad del artículo. Sin embargo, hay un ligero retraso entre el valor de retorno de la solicitud y el valor real en la base de datos. Parece que el valor se actualiza de inmediato, lo cual es excelente; sin embargo, el valor devuelto en la solicitud es el valor anterior en lugar de ser el valor de cantidad actual en la base de datos.
Base de datos mongoDB
// @route PUT api/list/item/quantity/:id // @desc update item quantity // @access Private router.put('/item/quantity/:id', auth, async (req, res) => { const { action } = req.body; try { let list = await List.findOne({ user: req.user.id }); // find current quantity const item = list.items.find((item) => { return item._id.toString() === req.params.id; }); // increase quantity if (action === 'increase') { list = await List.findOneAndUpdate( { 'items._id': req.params.id }, { $set: { 'items.$.quantity': item.quantity + 1 } }, { new: true } ); } else { // decrease quantity list = await List.findOneAndUpdate( { 'items._id': req.params.id }, { $set: { 'items.$.quantity': item.quantity - 1 } }, { new: true } ); } res.json(item.quantity); } catch (error) { console.error(error.message); res.status(500).send('Server Error'); } });Estás definiendo item aquí:
const item = list.items.find((item) => { return item._id.toString() === req.params.id; }); En este punto, la list es la versión "antigua" del objeto, desea hacer lo mismo después de la actualización cuando se actualice el objeto de la list y solo luego devolverlo.
// this is the original "list" item let item = list.items.find((item) => { return item._id.toString() === req.params.id; }); ... update list ... // now "list" is updated item = list.items.find((item) => { return item._id.toString() === req.params.id; });Solo agregaré dos consejos adicionales para mejorar el rendimiento, son mutuamente excluyentes, por lo que tendrá que elegir uno de los dos.
list._id , si tuviera que adivinar que la colección no tiene un índice en el campo de items (y si lo tiene, generalmente es una mala idea). esto significa que cuando actualizó solo usando el campo item._id , Mongo tarda más en encontrar el objeto. es un cambio rápido a ambas actualizaciones: list = await List.findOneAndUpdate( { _id: list._id, 'items._id': req.params.id }, { $set: { 'items.$.quantity': item.quantity - 1 } }, { new: true } ); const list = await List.findOneAndUpdate( { user: req.user.id, }, { $inc: { 'items.$[elem].quantity': action === 'increase' ? 1 : -1, }, }, { arrayFilters: [ { 'elem._id': new ObjectId(req.params.id), }, ], new: true, }); const item = list.items.find((item) => { return item._id.toString() === req.params.id; });En mi opinión, ahora su ruta se ve mucho mejor, también está reduciendo las llamadas de 2 db a 1.