forEach Loop не возвращает массив - PullRequest
0 голосов
/ 27 апреля 2018

Итак, у меня возникла проблема с возвратом значения из моего цикла запросов forEach MYSQL в Node JS и вставкой его в шаблон 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>

В первом файле console.log показаны замененные значения, а во втором - исходные значения массива, и поэтому страница загружается с исходными значениями (идентификаторами и т. Д. Вместо имен).

Как отправить внутренний / отредактированный массив в res.render вместо исходного массива?

Большое спасибо, Брэд

EDIT //////

При использовании JOIN выходные данные были правильными

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Проблема в том, что 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]})
                }
            };



        }

    })
});
0 голосов
/ 27 апреля 2018

Вы можете использовать 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
});
0 голосов
/ 27 апреля 2018

Полагаю, запросы к базе данных еще не возвращены, когда вы уже визуализируете объект Stock.

Помните, nodejs асинхронный. Вам нужно подождать, пока все запросы БД вернутся, прежде чем рендерить результат.

У меня действительно была похожая проблема, когда я впервые узнал о nodejs: JavaScript nodejs mysql с запросами в цикле

...