Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

170
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda