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

如何批量发送含ID数组的异步GET请求,避免循环调用

解决方案:批量获取模板行ID(避免多次请求)

前端修改:单次请求传递所有ID

无需循环发起请求,先收集所有需要查询的ID,通过一次请求传递给后端:

// 1. 从worksheetmatrixRows中提取所有ID
const targetIds = this.worksheetmatrixRows.map(row => row.Id);

// 2. 发起单次GET请求,用逗号分隔ID列表传递
const mergedTemplateRowIds = await this.httpClient.get<number[]>(
  `${GLOBAL.BASE_URL}/templaterow/${targetIds.join(',')}`
).toPromise();

// mergedTemplateRowIds就是合并后的所有结果数组

后端修改:支持批量ID查询并返回合并结果

原后端代码存在逻辑错误(遍历字符串字符而非ID列表)和SQL注入风险,以下是修正后的批量处理逻辑:

// 批量获取模板行ID接口(兼容单个/多个ID)
app.get('/templaterow/:ID', function (req, res) {
  logging('[GET] /templaterow');
  
  // 将传入的ID字符串按逗号分割为数组,过滤空值
  const templateIds = req.params.ID.split(',').filter(id => id.trim() !== '');
  
  if (templateIds.length === 0) {
    return res.status(400).send('未提供有效ID');
  }

  // 使用参数化查询避免SQL注入,IN语句配合数组参数
  const sql = `SELECT Id FROM template_row WHERE TemplateId IN (?) AND RowNo = 1`;
  
  wmsconn.query(sql, [templateIds], function (err, rows, fields) {
    if (err) {
      console.error('数据库查询错误:', err);
      return res.status(500).send('查询失败');
    }
    
    // 提取所有查询到的Id,组成纯数字数组返回
    const fetchedIds = rows.map(row => row.Id);
    console.log('获取到的模板行ID:', fetchedIds);
    res.json(fetchedIds);
  });
});

原后端代码的问题说明

  1. 逻辑错误:async.eachSeries(templateID, ...)会遍历字符串的每个字符(而非ID列表),导致无意义的重复查询
  2. SQL注入风险:直接用${req.params.ID}拼接SQL语句,容易被恶意注入
  3. 数据格式错误:JSON.stringify(rows[0].Id)会把数字ID转为字符串,不符合前端期望的数字数组格式

内容的提问来源于stack exchange,提问作者Mohammad Zarak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:45:34