Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

179
Vistas
Retraso en el valor de retorno - nodejs y mongoose

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

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

 // @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'); } });
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.

  1. en la consulta de actualización, agregue 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 } );
  1. (mi opción preferida) hágalo en una sola llamada, usando la opción actualizar arrayFilters , así:
 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; });

Parque infantil Mongo

En mi opinión, ahora su ruta se ve mucho mejor, también está reduciendo las llamadas de 2 db a 1.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda