修改AGStoShapefile的Node.js脚本,实现迭代请求GIS REST API规避502错误
解决方案:分批迭代请求规避GIS服务1000条限制
服务器返回502错误的核心原因是单次请求返回的记录数超过了服务端限制(最多1000条),只需将获取到的ObjectID列表拆分为多个批次,分批发起请求即可解决。以下是修改后的代码及关键说明:
修改后的代码片段
// 新增工具函数:将数组拆分为指定大小的批次 function chunkArray(arr, chunkSize) { const chunks = []; for (let i = 0; i < arr.length; i += chunkSize) { chunks.push(arr.slice(i, i + chunkSize)); } return chunks; } data.toString().split('\n').forEach(function (service) { var service = service.split('|'); if(service[0].split('').length == 0) return; var baseUrl = getBaseUrl(service[0].trim()); var reqQS = { where: '1=1', returnIdsOnly: true, f: 'json' }; var userQS = getUrlVars(service[0].trim()); // 合并参数 var qs = mixin(userQS, reqQS); qs = queryString.stringify(qs); var url = decodeURIComponent(getBaseUrl(baseUrl) + '/query/?' + qs); var throttle = 0; if(service.length > 2) { throttle = +service[2]; } rp({ url : url, method : 'GET', json : true }).then((body) => { // 将ObjectID列表拆分为每1000条一组的批次 const idChunks = chunkArray(body.objectIds, 1000); // 分批发起请求,支持节流延迟 idChunks.forEach((chunk, index) => { setTimeout(() => { requestService(service[0].trim(), service[1].trim(), chunk, throttle); }, index * throttle); }); }).catch((err) => { console.log(err); }); })
关键修改说明
- chunkArray工具函数:专门用来把大的ObjectID数组拆分成每1000条一组的小批次,完全贴合服务端的单次请求限制。
- 分批请求逻辑:获取到所有ObjectID后,不再一次性传给
requestService,而是遍历每个批次,通过setTimeout根据设置的throttle值控制批次间的延迟,避免短时间内发起过多请求触发服务器防御机制。 - 保留原有节流配置:如果原服务配置了
throttle值,批次间会自动添加对应延迟,无需额外调整。
内容的提问来源于stack exchange,提问作者Daniele Mosso
相关产品推荐
相关产品推荐

