Node.js中MySQL查询未执行且无报错的问题如何解决
问题根因
这段代码的核心问题是 Node.js 生态下的 MySQL 操作 API 均为异步非阻塞设计,你的同步写法不符合异步 API 的执行时序,同时还存在环境 API 兼容性问题:
- 若你直接在原生 Node.js 环境运行代码,Node.js 全局没有
alert方法,执行第一行alert("PING")就会直接抛出未定义错误,程序直接终止,自然不会执行到后面的alert("PONG")。如果你能正常看到 PING 的提示,说明你是在 Electron、NW.js 这类同时支持浏览器 API 和 Node.js API 的混合环境运行。 - 即便
alert可用,代码执行到connection.query()时不会等待 SQL 查询完成,只会把查询任务和回调函数交给事件循环调度,立刻往下执行后续代码。你在query之后直接调用了connection.end(),会直接关闭数据库连接,未执行完成的查询请求被直接终止,既不会返回结果,也不会触发回调内的错误抛出逻辑。
修复方案
回调写法适配异步时序
把连接关闭、后续业务逻辑都放到 query 的回调函数内部,保证查询执行完成后再运行后续逻辑:
alert("PING"); //Begin SQL query var mysql = require('mysql'); var connection = mysql.createConnection({ host : '127.0.0.1', user : 'root', password : 'password', port: 3306, database : 'db' }); connection.connect(); connection.query('SELECT * FROM test', function(err, rows, fields) { if (err) throw err; console.log(rows[0]); // 查询完成后再关闭连接 connection.end(); // 后续逻辑写在回调内部 alert("PONG"); });
async/await 写法(更易维护,避免回调嵌套)
推荐使用支持 Promise 的 mysql2 库,用同步写法的逻辑写异步操作:
// 先安装依赖:npm install mysql2 const mysql = require('mysql2/promise'); async function execQuery() { alert("PING"); const connection = await mysql.createConnection({ host : '127.0.0.1', user : 'root', password : 'password', port: 3306, database : 'db' }); try { const [rows] = await connection.query('SELECT * FROM test'); console.log(rows[0]); alert("PONG"); } catch (err) { throw err; } finally { // 无论查询成功失败都关闭连接 await connection.end(); } } execQuery();
内容的提问来源于stack exchange,提问作者oilrefiner946
相关产品推荐
相关产品推荐

