在节点js中创建API以使用我的SQL通过多个查询获取数据

时间:2018-12-10 05:46:31

标签: node.js api

我是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。

3 个答案:

答案 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链接承诺。