You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:17:44