如何修复getDbInfo Promise函数仅返回单条查询结果的问题
问题根因
- Promise 提前触发resolve:你的
resolve逻辑写在了单次数据库查询的回调函数中,第一个ID的查询完成后就会立即执行resolve结束当前Promise,剩下的ID查询还未执行完成,自然只能拿到1条查询结果。 - 结果插入逻辑错误:遍历查询返回结果
res时,你重复把整个res数组push到结果集中,而非插入res[k]单条数据,会导致返回结果结构异常。 - SQL注入风险:直接拼接用户传入的ID到SQL语句中,存在恶意注入攻击的安全隐患。
修复方案
推荐将每个ID的查询都包装为独立Promise,使用Promise.all等待所有查询完成后再统一返回结果,代码示例如下:
const getDbInfo = async (anArrayOfIDs) => { // 为每个ID生成独立的查询Promise const queryTasks = anArrayOfIDs.map(targetId => { return new Promise((resolve, reject) => { // 使用参数化查询避免SQL注入 pool.query( "SELECT * FROM `tbl_ofInfo` WHERE tbl_ofInfo.sqlID = ?", [targetId], (err, queryRes) => { if (err) { console.log("error: ", err); return reject(err); } resolve(queryRes); } ) }) }) // 等待所有查询完成后扁平化结果数组返回 const allQueryResults = await Promise.all(queryTasks); return allQueryResults.flat(); }
你调用该函数时可以通过await或者.then()拿到最终的全量匹配结果,如果需要处理错误可以在外层加try/catch捕获。
内容的提问来源于stack exchange,提问作者FCP
相关产品推荐
相关产品推荐

