MySQL代码无报错却未执行:数据库与表未创建问题求助
排查Node.js连接MySQL未执行数据库操作的问题
嘿,我看了你的代码,问题其实挺典型的,咱们一步步来拆解:
首先,你现在只看到"Connected!"日志,但数据库和表都没创建,核心问题出在事件监听的逻辑上:
- 你把所有数据库操作代码都放在了
con.on('error')回调里!这个回调只有当MySQL连接发生错误的时候才会触发,正常连接成功的情况下,这个回调根本不会执行,所以里面的CREATE DATABASE和CREATE TABLE代码完全没跑起来。而你看到的"Connected!"其实是写在错误回调里的,这说明可能之前你调试的时候遇到过连接错误,现在连接正常了,错误回调没触发,自然代码就没执行。
另外,就算你的代码能跑到创建表那一步,还会有第二个问题:创建表时没有指定要操作的数据库。你刚创建了killEmAll数据库,但没有切换到这个库,直接执行CREATE TABLE的话,MySQL不知道要在哪个数据库里建表,会抛出"Unknown database"的错误。
还有一点小细节:你的两个console.log都写的是"Database created",第二个应该改成"Table created",不然日志会混淆。
下面是修正后的代码,我调整了事件监听逻辑,处理了异步时序,还修复了数据库指定的问题:
var mysql = require('mysql'); var con = mysql.createConnection({ host: "localhost", user: "apm", password: "password123" }); // 监听连接成功事件,这才是执行初始化操作的正确时机 con.connect(function(err) { if (err) { console.log("[mysql error]", err); return; } console.log("Connected!"); // 创建数据库 var sql = "CREATE DATABASE IF NOT EXISTS killEmAll"; con.query(sql, function (err, result) { if (err) { console.log("[mysql error]", err); return; } console.log("Database created or already exists"); // 切换到刚创建的数据库 con.changeUser({database: 'killEmAll'}, function(err) { if (err) { console.log("[mysql error]", err); return; } // 创建表 var createTableSql = "CREATE TABLE IF NOT EXISTS users (firstName VARCHAR(255), secondName VARCHAR(255), email VARCHAR(255), username VARCHAR(255), password VARCHAR(255))"; con.query(createTableSql, function (err, result) { if (err) { console.log("[mysql error]", err); return; } console.log("Table created or already exists"); // 操作完成后可以关闭连接 con.end(); }); }); }); });
解释下修正点:
- 用
con.connect()的回调来处理连接成功后的逻辑,这是Node.js MySQL官方推荐的方式 - 创建数据库后,通过
changeUser切换到目标数据库,确保后续的表创建操作在正确的库中执行 - 处理了每个异步操作的错误,避免因为某个步骤出错导致整个流程卡住
- 调整了日志内容,让输出更清晰
- 操作完成后调用
con.end()关闭连接,避免资源泄漏
这样修改后,你应该就能看到数据库和表被正确创建的日志了。
内容的提问来源于stack exchange,提问作者Alexandru-Eugen Toma




