【问题标题】:forEach Loop not returning ArrayforEach 循环不返回数组
【发布时间】:2018-10-08 05:37:03
【问题描述】:

所以,我似乎在从 Node JS 中的 forEach MYSQL 查询循环返回一个值然后将其插入到 ejs 模板中时遇到问题。目前,这些是我的代码:

app.js GET 请求

app.get("/admin/stock", function(req, res) {
db.query("SELECT * FROM stock", function (err, stock) {
    if (err) {
        console.log("Error with showing SQL")
    } else {
        stock.forEach(function (stock) {
                db.query("SELECT * FROM product WHERE productID = " + 
stock.stock_productID, function (err, product) {
                    if (err) {
                        console.log("Error");
                    }
                    else {
                        stock.stock_productID = product[0].productName
                    }

                });
                db.query("SELECT * FROM currency WHERE currencyID = " + 
stock.stock_currencyID, function (err, currency) {
                    if (err) {
                        console.log("Error");
                    }
                    else {
                        stock.stock_currencyID = currency[0].currencyName
                    }

                });
                db.query("SELECT * FROM customer WHERE customerID = " + 
    stock.stock_customerID, function (err, customer) {
                    if (err) {
                        console.log("Error");
                    }
                    else {
                        stock.stock_customerID = 
    customer[0].customerBusiness;
                        console.log(stock);
                    }
                })
        });
    }
    console.log(stock);
    res.render("admin/stock", {stock:stock, userFName: req.user[1]})
})
});

股票页面 EJS

        <table class="generalTable">
            <tr>
                <th>Product Name</th>
                <th>Quantity</th>
                <th>Currency</th>
                <th>Cost</th>
                <th>Date Bought</th>
                <th>Bought From</th>
            </tr>
            <% stock.forEach(function(stock){ %>
            <tr>
                <td><%=stock.stock_productID%></td>
                <td><%=stock.quantityStockCurrent%></td>
                <td><%=stock.stock_currencyID%></td>
                <td><%=stock.priceBought%></td>
                <td><%=stock.boughtDate%></td>
                <td><%=stock.stock_customerID%></td>
            </tr>
            <% }) %>
        </table>

stock 的第一个 console.log 显示替换的值,但是第二个显示原始数组值,因此页面加载时使用原始值(ID 等,而不是名称)。

如何将内部/编辑后的数组发送到 res.render 而不是原始数组?

非常感谢, 布拉德

编辑//////

通过使用 JOIN,输出是正确的

【问题讨论】:

  • 您确实需要了解LEFT JOININNER JOIN 如何在SQL 中工作。您的代码是从关系数据库中检索信息的最低效的方式。修复这个没有用,请阅读连接并重写您的查询。
  • 非常感谢,我愚蠢地忘记了 JOIN!

标签: mysql arrays node.js foreach ejs


【解决方案1】:

我猜当你已经渲染了股票对象时,数据库查询还没有返回。

记住,nodejs 是异步的。在呈现结果之前,您必须等待所有数据库查询返回。

我第一次了解nodejs时确实遇到过类似的问题:JavaScript nodejs mysql with queries in a loop

【讨论】:

  • 感谢您的信息,我已经尝试过与您类似的工作方式,但我只是收到错误,无法调用 res.render
  • @SomeGenuineGuy 在 StackOverflow 上写一个新问题,如果你遇到困难。不要忘记输入所有堆栈跟踪和其他相关信息。陈述你的尝试和你的想法。如果你想感谢我,请点赞这篇文章!
【解决方案2】:

问题在于 javascript 是异步的,并且 Javascript 没有块作用域,这意味着您在循环完成之前渲染文件,因此您应该为此使用简单的 for 循环。

你应该用这个替换你的代码:-

app.get("/admin/stock", function(req, res) {
    db.query("SELECT * FROM stock", function (err, stocks) {
         var stock = JSON.parse(JSON.stringify(stocks));
        if (err) {
            console.log("Error with showing SQL")
        } else {
            for(var i = 0 ; i< stock.length; i++) {
                db.query("SELECT * FROM product WHERE productID = " +
                    stock[i].stock_productID, function (err, product) {
                    if (err) {
                        console.log("Error");
                    }
                    else {
                        stock[i].stock_productID = product[0].productName
                    }   

                });
                db.query("SELECT * FROM currency WHERE currencyID = " +
                    stock[i].stock_currencyID, function (err, currency) {
                    if (err) {
                        console.log("Error");
                    }
                    else {
                        stock[i].stock_currencyID = currency[0].currencyName
                    }

                });
                db.query("SELECT * FROM customer WHERE customerID = " +
                    stock[i].stock_customerID, function (err, customer) {
                    if (err) {
                        console.log("Error");
                    }
                    else {
                        stock[i].stock_customerID =
                            customer[0].customerBusiness;
                        console.log(stock);
                    }
                });
                if(i === stock.length-1){
                    console.log(stock);
                    res.render("admin/stock", {stock:stock, userFName: req.user[1]})
                }
            };



        }

    })
});

【讨论】:

  • 感谢您的帮助,我现在收到此错误:TypeError: Cannot set property 'stock_productID' of undefined 为什么会这样?
  • 我认为你从 stock 表中获得的股票是空的,所以你会得到 TypeError 所以你应该首先控制 stock 以了解实际包含的股票
  • 查询完成后库存不为空,如何在库存表完全查询后才运行for循环?谢谢
  • 我编辑代码试试看如果你遇到类似的问题把你在整理库存后得到的数据发给我
  • TypeError: Cannot set property 'stock_productID' of undefined at Query._callback app.js:292:50) -- 这相当于上面代码 sn-p 中的第 13 行
【解决方案3】:

您可以使用 async.map 循环执行查询。

function getResults(id,cb){
  db.query("SELECT * FROM product WHERE productID = " +
            id.stock_productID, function (err, product) {
            if (err) {
                console.log("Error");
            }
            else {
                id.stock_productID = product[0].productName
            }   

        });  
}
async.mapLimit(stock, 5, function(id, callback) {
   getResults(id, function (err, res) {
    if (err) return callback(err);
    callback(null, res);
   })
}, function(err, results) {
// results is an array of names
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2014-12-19
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2022-06-29
    相关资源
    最近更新 更多