所以,我似乎遇到了从Node JS中的forEach MYSQL查询循环中返回值然后将其插入到ejs模板中的问题。目前,这些是我的代码片段:
app.js获取请求
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 of stock显示替换值,第二个显示原始数组值,因此页面加载了原始值(ID等,而不是名称)。
如何将内部/已编辑的数组发送到res.render而不是原始数组?
非常感谢, 布拉德
EDIT //////
通过使用JOIN,输出正确
答案 0 :(得分:0)
我想当你已经渲染了库存对象时,数据库查询还没有返回。
请记住,nodejs是异步的。在渲染结果之前,您必须等待所有数据库查询返回。
当我第一次了解nodejs时,我确实遇到了类似的问题:JavaScript nodejs mysql with queries in a loop
答案 1 :(得分:0)
问题是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]})
}
};
}
})
});
答案 2 :(得分:0)
您可以使用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
});