Node.js中Async/Await调用MySQL返回undefined问题求助
Node.js中Async/Await调用MySQL返回undefined的问题解决
问题核心出在三个关键误区:
- 混用回调函数与
async/await:当sql.query传入回调时,不会返回Promise,导致await无法捕获异步结果 getdata函数的else分支无返回值:函数执行到该分支时默认返回undefined- 回调内部的
return作用域受限:回调里的返回值无法传递到外部函数作用域
修复方案
方案1:使用支持Promise的MySQL库(推荐mysql2/promise)
先安装依赖:
npm install mysql2
修改数据库连接文件(./db.js),启用Promise模式:
const mysql = require('mysql2/promise'); const pool = mysql.createPool({ host: '你的数据库主机', user: '数据库用户名', password: '数据库密码', database: '目标数据库名' }); module.exports = pool;
调整getdata函数逻辑:
var sql = require('./db'); let h = /^[a-zA-Z-_.\d ]{2,180}$/; async function getdata(hash){ if (!hash || !hash.match(h)) { return {type: "error", msg:"Verarbeitungsfehler, bitte laden Sie die Seite neu.", admin: false}; } else { // 直接await返回Promise的query方法 const [result] = await sql.query('SELECT * FROM bnutzer WHERE hash = ?', [hash]); // 必须返回查询结果 return result; } } module.exports = { getdata };
方案2:手动封装回调为Promise(兼容旧版mysql库)
若不想更换依赖,可将sql.query封装为Promise:
var sql = require('./db'); let h = /^[a-zA-Z-_.\d ]{2,180}$/; async function getdata(hash){ if (!hash || !hash.match(h)) { return {type: "error", msg:"Verarbeitungsfehler, bitte laden Sie die Seite neu.", admin: false}; } else { // 封装回调逻辑为Promise const result = await new Promise((resolve, reject) => { sql.query('SELECT * FROM bnutzer WHERE hash = ?', [hash], (err, res) => { if (err) reject(err); else resolve(res); }); }); // 返回查询结果 return result; } } module.exports = { getdata };
调用代码无需修改
你的调用逻辑是正确的,修改getdata后,await admin.getdata(h)即可正常获取查询结果。
关键注意点
async/await是Promise的语法糖,必须基于Promise才能生效,禁止同时混用回调与await- 异步函数的所有分支都必须有明确返回值,否则默认返回
undefined - 回调函数内部的
return仅在自身作用域有效,无法传递到外部函数
内容的提问来源于stack exchange,提问作者Mahony Production
相关产品推荐
相关产品推荐

