依山尽
依山尽
  • 发布:2023-04-03 14:55
  • 更新:2023-04-03 17:49
  • 阅读:277

【报Bug】循环调用分页查询接口获取所有数据会无规律出现某一页查询异常

分类:uniCloud

产品分类: uniCloud/App

示例代码:
//分页获取数据接口  
async function _getAnsCard_page(query, fieldGet, pageSize = 30,  afterTime = 0,firstTime = 0) {  
       const dbcmd = db.command;  
       var defaultQuery ={startTime: dbcmd.lt(afterTime)}  
        //若不过滤起始时间  
        if(afterTime==0&&firstTime==0){  
            afterTime = new Date().getTime();  
            defaultQuery.startTime = dbcmd.lt(afterTime);  
        }//过滤起始时间     
        else if(afterTime>0 && firstTime>0){  
            defaultQuery.startTime = dbcmd.gte(firstTime).and(dbcmd.lt(afterTime))  
        }  

        var newQuery =Object.assign(  
            defaultQuery,  
            query  
        )   

        var newFieldGet =Object.assign(  
            {   
                _id:true ,  
            },  
            fieldGet  
        )  
        console.log("newQuery")  
        console.log(`afterTime=${afterTime},firstTime=${firstTime}`)  
        let resdb = await examdb_ansCard.where(newQuery).limit(pageSize).orderBy("startTime","desc").get();  
        return {  
            errCode: 0,  
            errMsg: '查询成功',  
            data: resdb.data,  
            pageSize:pageSize  
        }  
}
async function _getAnsCard_all(query, fieldGet,afterTime,firstTime){  

    var haveMore= false;  
    var allAnsCardList = [];  
    var pageSize = 500;  

    do{  
            console.log("开始获取所有数据query")  
        var res =await _getAnsCard_page(query,fieldGet,pageSize,afterTime,firstTime);  
        console.log("获取到数据")  
        if(res.data.length>0){  
            allAnsCardList = allAnsCardList.concat(res.data);  
        }     
        console.log("获取到数据")  
        //还有下一页,则继续查询  
        if(res.data.length==pageSize){  
            haveMore = true;  
            var lastItem = res.data[pageSize-1];  
            afterTime = lastItem.startTime;  
        }  
        else {  
            haveMore = false;  
        }  
        console.log("还有下一页"+haveMore)  
    }while(haveMore);  

    return allAnsCardList;  
}  

操作步骤:
var query = {     
             accuracyRate:dbcmd.gt(60)  
        }  
    var fieldGet={  
        objId:true,  
        objName:true,  
        accuracyRate:true,  
        time:true,  
        startTime:true,  
        userId:true  
    };  
var start = 1679875200000;  
var end = 1680480000000;  
var ansCardList = await _getAnsCard_all(query,fieldGet,end,start);

预期结果:

循环调用分页查询接口,将符合查询条件的6593条数据查询出来。

实际结果:

循环调用分页查询接口时,无规律的在某一页查询时,查询语句没有响应,无任何错误提示,接口执行状态为未知

bug描述:

问题现象:
1、定时任务从13万条数据中查找最近一周的数据,数据量约8千条,循环根据时间分页每页500条的方式获取数据,会随机出现接口调用的未错误。出错原因是分页查询出现未知规律的异常,有时是第5页查询异常,有时是第15页查询异常,没有错误提示,接口执行状态为未知
2、将出现异常的查询语句放到JQL执行,正常执行。
3、近期几周功能是正常的,就上周发现异常,定时任务执行数据统计异常。本次与前几周相比数据可能会多些,因为本周用户量增加了差不多3000,产生的数据对比上周多,总共有6593条,但是之前测试也由从几万条数据取8千多的查询没有发现异常。

这个获取全量数据的分页方法设计是根据官方的思路进行的,如果不能这么设计,请告知正确方法或解决方案。

2023-04-03 14:55 负责人:无 分享
已邀请:
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

看下是不是云函数运行时间超出了配置的云函数超时时间

  • 依山尽 (作者)

    的确是,多谢,调成最大后可以了。

    2023-04-03 18:49

要回复问题请先登录注册