首页 文章

在节点js中创建API以使用我的sql获取具有多个查询的数据

提问于
浏览
0

我是节点js的新手 . 我正在尝试开发用于按类别列表获取项目列表的API . 为此,我创建了一个函数来从表(featured_tags)中获取所有可用的活动特征标签 . 在特色标签列表提取之后,我想从(项目)表中获取属于该特定标签的项目列表 . 任何人都可以帮助我如何在节点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()中控制featuretag_dataset数组时,它向我展示了我必须在API响应中传递的完美响应 . 但在route.js中,它显示数据参数为空 .

任何人都可以帮助我如何在节点js中开发这种类型的API .

3 回答

  • 0

    这是因为 helper.getitems(featuredtags) 方法被成功调用,但发送响应不会等到方法返回响应,因为节点js是 asynchronous .

    你需要以一种它应该串行工作的方式编写代码 . 我已经创建了示例您可以试试这个 .

    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
                    });
                })
    
            }
    });
    
  • 2

    您忘记在 roter.js 中使用 await 来调用异步函数,只需将路由器更新为此

    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
        });
    
    });
    
  • 0

    您可以使用嵌套回调函数或异步等待函数或链接的promises .

相关问题