Node.js 数组中的NodeJs item变量只接受for循环中的第一个值

Node.js 数组中的NodeJs item变量只接受for循环中的第一个值,node.js,express,asynchronous,Node.js,Express,Asynchronous,我正在使用expressJs发送一些POST请求。 我从客户端传递一个对象对象,在服务器上用for循环遍历每个对象 我的问题是,循环中的变量cantidad只取第一个值,而不是刷新到池中。query,但在池之前。query取正确的值 所以,下面这行就可以了 console.log("cantidad before query: " + cantidad); 但下面这条线很糟糕。它具有第一个值 console.log("cantidad in query: " + cantidad); 这是我

我正在使用expressJs发送一些POST请求。 我从客户端传递一个对象对象,在服务器上用for循环遍历每个对象

我的问题是,循环中的变量
cantidad
只取第一个值,而不是刷新到
池中。query
,但在
池之前。query
取正确的值

所以,下面这行就可以了

console.log("cantidad before query: " + cantidad);
但下面这条线很糟糕。它具有第一个值

console.log("cantidad in query: " + cantidad);
这是我代码的一部分

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);
    ...
这是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();
});
这就是对象的外观

{ '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' } }

这是因为的函数
是同步的,而函数
poll.query
是异步的。这意味着使用for循环实际上是在对一些查询进行排队。你不是在一个接一个地执行它们。因此,for循环将在查询返回一个结果之前完成。如果您想在下一次迭代中使用查询中的数据,那么应该开始使用async.js,这是一个npm模块,可以帮助您避免此问题。TL;DR您认为在查询中运行的控制台日志实际上是在一个查询完成之前运行的。需要更多关于在何处声明变量cantidad以及何时更改它以准确理解问题的信息

更新: 我一开始告诉你的是非常错误的,因为我误解了在拘留else{}期间发生的事情。但我告诉你的事实已经是问题所在了。它被很好地混淆了。for循环甚至在一个查询完成之前就完成了。他们只是在排队。因此,第二个console.log将具有循环中最后一个键的键。如果您需要需要知道您在哪个迭代中的逻辑,那么您应该实现一个异步函数,以便知道您实际在哪个迭代中。如果您不想使用异步库,您可以使用类似的东西

首先在js文件的底部添加此函数

实际上,您创建了一个异步for循环,现在您可以知道在哪个迭代中使用loop.iteration()。然后用下面写的代码替换post代码(包括异步循环)。

好的,你知道如何实施吗?使用async.parallel?系列瀑布?每个系列?实际上,我的变量
cantidad
不是查询的结果,而是对象
objects
的一部分。查询结果是另一个正在成功更新的变量。是否根据查询结果更改变量cantidad?如果是,那么我相信级数函数就是你要找的。它将确保在前一个查询完成后调用每个查询。在阅读您编辑的评论后,我仍然不理解这个问题。在代码的哪一部分中更改变量cantidad?因为你说只有第一个值是控制台记录的。不,我没有。我有一个对象的对象。每个对象都有自己的
cantidad
变量。我需要将它们逐一迭代到
池的
else{}
中。我添加了完整的POST方法以使其更清晰。这是有意义的。编辑之前使用的标识使我认为else{}是if(objects.hasOwnProperty(key)){}的一部分。让我看看。问题似乎不在于我之前解释的。