Estoy usando expressJs para enrutar algunas solicitudes POST. Del lado del cliente paso un objeto de objetos y en el servidor itero sobre cada uno de ellos con un bucle for.
Mi problema, la variable cantidad en el bucle solo toma el primer valor en lugar de actualizarse en pool.query , pero antes de pool.query toma el valor correcto.
Entonces, la línea de abajo está bien.
console.log("cantidad before query: " + cantidad);Pero la línea de abajo es mala. Tiene el primer valor.
console.log("cantidad in query: " + cantidad);Esto es parte de mi código.
for (var key in objects) { if (objects.hasOwnProperty(key)) { ... console.log("cantidad before query: " + cantidad); pool.query(qProducto,idProducto, function (error, results, fields { if (error) { ... } else { console.log("cantidad in query: " + cantidad); ...Este es el POST completo en ExpressJs.
app.post("/commanda", function (req, res) { var idCuenta = req.body.idCuenta; var idEmpleado = req.body.idEmpleado; var fechaRegistro = req.body.fechaRegistro; var cuenta_mesero = "C:" + idCuenta + ":E:" + idEmpleado; var objects = req.body.objects; var element = {}; for (var key in objects) { if (objects.hasOwnProperty(key)) { var qProducto = "SELECT descripcionProducto FROM PRODUCTO WHERE idProducto = ? ;"; var descProducto = ''; console.log("cantidad in commanda2 : " + objects[key].cantidad ); try { pool.query(qProducto, objects[key].idProducto, function (error, results, fields) { if (error) { console.error(error); console.error("Failed with query: " + qProducto); res.status(500).end(); throw error; } else { console.log("cantidad in commanda4 : " + objects[key].cantidad ); descProducto = JSON.stringify(results[0].descripcionProducto); element = { idProducto:objects[key].idProducto, cantidad:objects[key].cantidad, descProducto:descProducto, cuenta_mesero:cuenta_mesero, fechaRegistro:fechaRegistro }; imprimirOrden(element); } }); } catch (error) { callback(error); } } } printer.printVerticalTab(); res.status(200).end(); });Así es como se ve un objeto.
{ '0': { idProducto: '28', cantidad: '3', descProducto: 'Product1', precioProducto: '3500', precioTotal: 10500, '$$hashKey': 'object:345' }, '1': { idProducto: '29', cantidad: '2', descProducto: 'Product2', precioProducto: '4500', precioTotal: 9000, '$$hashKey': 'object:346' } }Esto sucede porque la función for es síncrona pero la función poll.query es asíncrona. Lo que esto significa es que al usar el bucle for, esencialmente está poniendo en cola algunas consultas. No los estás ejecutando uno por uno. Por lo tanto, el ciclo for terminará antes de que se devuelva un solo resultado de la consulta. Si desea utilizar los datos de la consulta para la próxima iteración, debe comenzar a usar async.js, un módulo npm que lo ayuda a evitar estos problemas. TL; DR el registro de la consola que cree que se ejecuta en la consulta en realidad se ejecuta incluso antes de que finalice una consulta. Se necesita más información sobre dónde declara la variable cantidad y cuándo la cambia para comprender con precisión el problema.
ACTUALIZACIÓN: Lo que te dije al principio estuvo bastante mal debido al hecho de que no entendí bien la detención del else {}. Pero lo que ya te dije es en realidad el problema. Estaba bien ofuscado. El ciclo for finaliza incluso antes de que termine una consulta. Solo están en cola. Entonces, el segundo console.log tendrá la clave de la última clave en el ciclo. Si necesita una lógica que requiera saber en qué iteración se encuentra, debe implementar una función asíncrona para saber en qué iteración se encuentra realmente. Si no desea usar la biblioteca asíncrona, puede usar algo como esto.
Primero agregue esta función en la parte inferior de su archivo js https://pastebin.com/4tR0xaTY
Básicamente, creó un bucle for asíncrono que ahora puede saber en qué iteración está utilizando loop.iteration(). Luego reemplace su código postal con el código escrito a continuación (para incluir el bucle asíncrono). https://pastebin.com/YzZU7bqp