Node.js中从MySQL查询结果返回值显示undefined问题求助
解决Node.js MySQL异步查询返回undefined的问题
你的问题核心是异步操作的执行顺序:db.query是异步函数,它的回调会在数据库查询完成后才执行,但你的getAns函数在回调执行前就已经结束了,所以函数本身没有返回值,调用时自然得到undefined。另外你调用getAns()时没有传uname参数,这也会导致查询条件异常。
下面给你两种可行的解决方式:
方式一:用Promise + async/await(推荐,代码更易读)
先把getAns封装成返回Promise的函数:
const getAns = (uname) => { return new Promise((resolve, reject) => { const query = "SELECT ans FROM users WHERE username = ?"; db.query(query, uname, (err, rows) => { if (err) { reject(err); } else { // 用可选链?.避免查询不到数据时rows[0]为undefined报错 resolve(rows[0]?.ans); } }); }); };
调用时使用async/await处理异步:
const getData = async () => { try { // 必须传入用户名参数,比如'xxx' const ans = await getAns('xxx'); console.log(ans); } catch (err) { console.error('查询出错:', err); } }; getData();
方式二:使用回调函数
修改getAns,让它接受一个回调函数作为参数:
const getAns = (uname, callback) => { const query = "SELECT ans FROM users WHERE username = ?"; db.query(query, uname, (err, rows) => { if (err) { callback(err); } else { callback(null, rows[0]?.ans); } }); };
调用时通过回调获取结果:
const getData = () => { // 传入用户名和回调函数 getAns('xxx', (err, ans) => { if (err) { console.error('查询出错:', err); } else { console.log(ans); } }); }; getData();
注意点
- 调用
getAns时必须传递uname参数,否则查询条件中的username会是undefined,大概率查不到数据。 - 处理数据库查询时要考虑查询不到数据的情况(比如用户名不存在),用
rows[0]?.ans可以避免rows[0]为undefined时抛出错误。
内容的提问来源于stack exchange,提问作者Cutting_edge
相关产品推荐
相关产品推荐

