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

Node.js中用async/await调用SQL仍异步,返回值获取失败求助

问题分析与修复方案

核心问题

  1. stmt.exec是回调式API,不支持直接await:你用await调用了一个基于回调的函数,但await仅对Promise生效,这行代码不会等待回调执行完成,导致get_data直接返回undefined。
  2. get_data未返回有效结果:回调函数里的return x只是回调自身的返回值,不会成为get_data的返回值;同时因未正确处理Promise,函数默认返回undefined。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:11:20