Node.js中用async/await调用SQL仍异步,返回值获取失败求助
问题分析与修复方案
核心问题
stmt.exec是回调式API,不支持直接await:你用await调用了一个基于回调的函数,但await仅对Promise生效,这行代码不会等待回调执行完成,导致get_data直接返回undefined。get_data未返回有效结果:回调函数里的return x只是回调自身的返回值,不会成为get_data的返回值;同时因未正确处理Promise,函数默认返回undefined。main()返回Promise,直接打印无法获取结果:async函数必然返回Promise对象,直接let data = main()得到的是Promise实例,不是最终查询数据。
修复后的代码
const { dbconn, dbstmt } = require('idb-connector'); // 将回调式的exec封装为Promise function execStmt(stmt, sql) { return new Promise((resolve, reject) => { stmt.exec(sql, (result, error) => { if (error) { reject(error); return; } resolve(result); }); }); } async function get_data() { const sql_stsmt = 'SELECT * FROM QIWS.QCUSTCDT'; const conn1 = new dbconn(); const stmt = new dbstmt(conn1); try { conn1.conn('*LOCAL'); // 等待封装后的Promise完成,拿到查询结果 const result = await execStmt(stmt, sql_stsmt); // 关闭数据库资源 stmt.close(); conn1.disconn(); conn1.close(); console.log("1.."); console.log("%s", JSON.stringify(result)); // 返回查询结果,作为get_data的Promise resolve值 return result; } catch (error) { console.error(error); // 抛出错误让上层捕获,避免吞掉异常 throw error; } } async function main() { try { const result = await get_data(); console.log("2.."); console.log("%s", JSON.stringify(result)); return result; } catch (error) { console.error(error); throw error; } } // 正确处理main返回的Promise,获取最终结果 main() .then(data => { console.log("3.."); console.log("%s", JSON.stringify(data)); }) .catch(err => console.error(err));
关键修复点
- 封装回调为Promise:创建
execStmt函数,把stmt.exec的回调逻辑转换为Promise,让await可以正确等待查询完成。 get_data返回有效结果:在await拿到查询结果后返回该值,确保get_data的Promise最终resolve为查询数据。- 正确处理Promise结果:
main()返回的是Promise,需用.then()获取最终数据,或在另一个async函数里await main()。 - 优化错误处理:将
return console.error(error)改为throw error,让上层catch能捕获到异常,避免错误被隐藏。
内容的提问来源于stack exchange,提问作者mortimer
相关产品推荐
相关产品推荐

