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

async/await调用含mysql查询的异步函数返回undefined问题咨询

问题原因

  • 标注了async的wcNam2Uid2没有返回合法的Promise对象,await只能等待Promise状态变更,没有返回Promise的情况下await会直接拿到undefined,所以caller里的打印会先执行
  • 代码中的return wcid是写在setTimeout的回调函数内,返回值只会给到回调本身,不会作为外层wcNam2Uid2的返回值
  • 原代码还存在SQL注入风险(直接拼接用户输入到SQL语句)、con.end未实际执行(漏写括号,只拿到了方法引用)两个隐藏问题

修复代码

把wcNam2Uid2的逻辑封装为Promise返回即可,调用方代码无需修改:

async function wcNam2Uid2(wcname) {
  const mysql = require('mysql');
  const mnam = wcname;
  console.log("Enter nam2userid , input:" + mnam);
  // 封装为Promise返回
  return new Promise((resolve, reject) => {
    const con = mysql.createConnection({
      host: "localhost",
      user: "root",
      password: "",  
      database: "crm"
    });
    con.connect(function(err) {
      if (err) return reject(err);
      // 使用参数化查询避免SQL注入
      con.query("SELECT wc_id FROM wcdirlist where name = ?", [mnam], function (err, result, fields) {
        setTimeout(() => { 
          if (err) return reject(err);
          const wcid = result[0].wc_id;
          console.log("result id :" + wcid);
          // 正确关闭数据库连接
          con.end();
          console.log(" nam2userid resolved , wc_id :  " + wcid);
          // 用resolve把值传到Promise外部,供await拿到
          resolve(wcid);            
        },2000);
      });
    });
  })
}

生效逻辑

修改后wcNam2Uid2会返回一个Promise对象,await会等待Promise调用resolve后才会继续执行后续代码,caller里的uid就能正常拿到返回的wcid值,打印顺序也会符合预期。

内容的提问来源于stack exchange,提问作者TLCW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:54:09