如何批量发送含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); }); });
原后端代码的问题说明
- 逻辑错误:
async.eachSeries(templateID, ...)会遍历字符串的每个字符(而非ID列表),导致无意义的重复查询 - SQL注入风险:直接用
${req.params.ID}拼接SQL语句,容易被恶意注入 - 数据格式错误:
JSON.stringify(rows[0].Id)会把数字ID转为字符串,不符合前端期望的数字数组格式
内容的提问来源于stack exchange,提问作者Mohammad Zarak
相关产品推荐
相关产品推荐

