NodeJS使用mysql异步查询时如何保证循环执行完成后再返回结果
解决方案
核心问题定位
你遇到的执行顺序问题本质上是回调式异步API没有正确和async/await逻辑适配导致的,具体错误点如下:
- 原
get_hashtag函数没有返回Promise对象,await Promise.all()等待的是包含undefined的数组,会立刻执行完成,不会等待数据库查询结束 - 手动封装Promise时没有主动调用
resolve触发状态变更,Promise会一直处于pending状态,await逻辑会永久卡住 - 边修改原始文本边执行正则匹配,会导致正则的
lastIndex指针错乱,出现漏匹配、重复匹配的异常
代码修改步骤
步骤1:将回调式API封装为Promise
首先修改get_hashtag函数,使其返回Promise对象,支持await等待:
function get_hashtag(tag) { return new Promise((resolve, reject) => { let md5_val = md5(tag); let query = "some_SELECT_query_here_searching_for_rows_with_matching_MD5_value"; main_file.getDBAccess(query, function (err, rows) { if (err) return reject(err); const hash_id = rows.length > 0 ? rows[0].id : -1; resolve(hash_id); }); }) }
步骤2:改写处理逻辑保证顺序执行
给processHashtagsFromInput加上async声明,先一次性收集所有匹配的标签,再按顺序逐个处理替换:
async function processHashtagsFromInput(text) { const regex = /#([^`~!@$%^&*\#()\-+=\\|\/\.,<>?\'\":;{}\[\]* ]+)/g; // 先收集所有匹配项,避免边修改边匹配导致的异常 const matches = []; let match; while((match = regex.exec(text)) !== null) { matches.push({ fullMatch: match[0], tag: match[1] }) } // 按顺序逐个执行查询、替换逻辑 for(const item of matches) { const hashId = await get_hashtag(item.tag); const syntax = `#[${hashId}]`; text = text.replace(item.fullMatch, syntax); } return text; }
步骤3:正确调用异步函数
async函数返回的是Promise对象,调用时需要使用await或者.then()获取最终处理后的文本:
// 调用示例 async function run() { const inputText = "测试#标签1 测试内容#标签2"; const result = await processHashtagsFromInput(inputText); console.log(result); } run();
可选优化(避免重复连接报错)
你当前的getDBAccess每次调用都会执行con.connect,重复调用会抛出「连接已存在」的错误,建议把连接初始化逻辑移到模块加载阶段,只执行一次:
// index.js修改示例 const con = mysql.createConnection({ host: process.env.DBHOST, user: process.env.DBUSER, password: process.env.DBPASS, database: process.env.DBSCHEMA, charset: 'utf8mb4' }); // 模块加载时仅连接一次 con.connect(err => { if (err) throw err; }) module.exports = { getDBAccess: function(sqlString, callback) { con.query(sqlString, function (err, recordset) { if (err) return callback(err) return callback(null, recordset); }); } }
内容的提问来源于stack exchange,提问作者guest86
相关产品推荐
相关产品推荐

