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
相关产品推荐
相关产品推荐

