我是Node js的新手,并尝试从各种表中获取数据。我从第一查询中获得了正确的数据,但是在该循环中,我的对象数组变为空。下面是我的代码,如果需要任何更改,请告诉我。
connection.query(`SELECT * FROM featured_tags WHERE status = 1 order by id desc`, function (error, results, fields) {
if (error) {
res.json({
status:401,
message:'there are some error with query'
})
}else{
var featured_tagdataset = [];
var itemdata = [];
if(results.length >0){
for (var i = 0; i < results.length; i++) {
var row = results[i];
var featurtag = {};
featurtag.id = row.id;
featurtag.featured_tag = row.featured_tag;
connection.query("SELECT * FROM `items` WHERE status = 1 and FIND_IN_SET('"+ row.id +"' ,featured_tags) > 0", function (error1, itemresult, fields) {
if(itemresult.length > 0){
for(var l=0; l < itemresult.length; l++){
var itemrow = itemresult[l];
var item = {};
item.id = itemrow.id;
item.category_id = row.id;
item.name = itemrow.item_name;
itemdata.push(item);
}
}
console.log(itemdata);
});
featurtag.tag_items = itemdata;
featured_tagdataset.push(featurtag);
}
}
res.json({
status:200,
message:'item list',
data: featured_tagdataset
});
}
});
我能够在console.log(itemdata)中获取数据;但是在featurtag.tag_items = itemdata中,它显示了空白数组。像下面一样
"data": [
{
"id": 4,
"featured_tag": "User's Choice",
"tag_items": []
},
{
"id": 1,
"featured_tag": "Recomanded",
"tag_items": []
}
]
答案 0 :(得分:0)
您执行此操作的方式存在多个问题,但看来您的主要问题是基于您对诺言的理解。 connection.query(...)
返回一个诺言,其中包含您要在其中利用的数据。因为这是一个承诺,而不是立即返回数据,所以您将无法以预期的方式访问它。
如果您确定这是您要采用的方法,则需要在函数中使用杠杆和async-await
,这样,在转到下一个之前,您将拥有所需的数据。循环的重复。
另一种方法可能是利用sequelize,并在查询中使用include
自动将数据包括在查询中。我敢肯定,您也可以通过一个更复杂的sql查询,以将所有信息都包含在一个查询中,但仅提供一些可能的建议以供将来使用。
================================================ =========================== 编辑:
这是一个未经测试的示例,在该示例中,我尝试修改您的代码以适合异步模式。不过,我认为您绝对应该修改此代码,以使其作为单个查询执行,而不是遍历结果。
async function test() {
let results;
try {
results = await connection.query('SELECT * FROM featured_tags WHERE status = 1 order by id desc');
} catch (e) {
return res.status(401).json({message:'there are some error with query'});
}
var featured_tagdataset = [];
var itemdata = [];
if (results.length > 0) {
for (var i = 0; i < results.length; i++) {
var row = results[i];
var featurtag = {};
featurtag.id = row.id;
featurtag.featured_tag = row.featured_tag;
// Get item results
let itemresult;
try {
itemresult = await connection.query("SELECT * FROM `items` WHERE status = 1 and FIND_IN_SET('"+ row.id +"' ,featured_tags) > 0");
} catch (e) {
// Handle error
}
if (itemresult.length > 0){
for(var l=0; l < itemresult.length; l++){
var itemrow = itemresult[l];
var item = {};
item.id = itemrow.id;
item.category_id = row.id;
item.name = itemrow.item_name;
itemdata.push(item);
}
}
console.log(itemdata);
featurtag.tag_items = itemdata;
featured_tagdataset.push(featurtag);
}
}
return res.status(200).json({message:'item list', data: featured_tagdataset});
}
答案 1 :(得分:0)
一种异步方式是:
connection.query(`SELECT * FROM featured_tags WHERE status = 1 order by id desc`)
.then(results=>{
//Query was successful and has given results, all your code in this block
}).catch(err=>{
res.status(401).json({err})
}
)