我是Node js的新手。我正在尝试开发API,以按类别列表获取项目列表。为此,我创建了一个函数来从表中获取所有可用的活动功能标签(featured_tags)。在获取功能标签列表之后,我想从属于该特定标签的(items)表中获取项目列表。谁能帮我在Node JS中做到这一点。我正在使用mysql数据库。
我做了以下事情来从表中获取类别。
route.js文件
this.app.get('/list_menu',async(request,response) =>{
var itemlist = '';
const featuretags = helper.getFeatureTag().then(function(featuredtags){
//console.log('test');
itemlist = helper.getitems(featuredtags);
});
response.status(200).json({
status:200,
message: "success",
data:itemlist
});
});
用于在helper.js文件中获取活动的特色标签的功能
async getFeatureTag(){
return this.db.query("select * from featured_tags where status = 1 order by id desc ");
//const featuredtags = await this.db.query("select * from featured_tags where status = 1 order by id desc ");
}
该功能可在helper.js文件中获取特色标签的项目列表
async getitems(featuredtags){
var itemdata = [];
var featured_tagdataset = [];
if(featuredtags.length > 0){
for (var i = 0; i < featuredtags.length; i++) {
var row = featuredtags[i];
var featurtag = {};
featurtag.id = row.id;
featurtag.featured_tag = row.featured_tag;
var itemresult = await this.db.query("SELECT * FROM `items` WHERE status = 1 and FIND_IN_SET('"+ row.id +"' ,featured_tags) > 0");
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(JSON.stringify(item));
}
}
featurtag.tag_items = itemdata;
featured_tagdataset.push(featurtag);
}
//console.log(featured_tagdataset);
return featured_tagdataset;
}else{
return null;
}
}
当我在helper.js文件的itemlist()中控制台Featuredtag_dataset数组时,它向我显示了完美的响应,我必须传递API响应。但是在route.js中,它显示了data参数为空。
任何人都可以帮助我解决如何在节点js中开发此类API。
答案 0 :(得分:2)
这是因为 helper.getitems(featuredtags)方法已成功调用,但是由于节点js是异步,因此发送响应不会等到该方法返回响应。>
您需要以顺序工作的方式编写代码。我已经创建了示例示例,您可以尝试一下。
this.app.get('/list_menu',async(request,response) =>{
helper.getFeatureTag().then(function(featuredtags){
helper.getitems(featuredtags).then(function(itemlist){
response.status(200).json({
status:200,
message: "success",
data:itemlist
});
})
}
});
答案 1 :(得分:0)
您忘记在调用异步功能的await
中使用roter.js
,只是将路由器更新为此
this.app.get('/list_menu',async(request,response) =>{
const featuredtags = await helper.getFeatureTag(),
itemlist = await helper.getitems(featuredtags);
response.status(200).json({
status:200,
message: "success",
data:itemlist
});
});
答案 2 :(得分:0)
您可以嵌套回调函数或异步等待函数,也可以使用then链接承诺。