You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL代码无报错却未执行:数据库与表未创建问题求助

排查Node.js连接MySQL未执行数据库操作的问题

嘿,我看了你的代码,问题其实挺典型的,咱们一步步来拆解:

首先,你现在只看到"Connected!"日志,但数据库和表都没创建,核心问题出在事件监听的逻辑上:

  • 你把所有数据库操作代码都放在了con.on('error')回调里!这个回调只有当MySQL连接发生错误的时候才会触发,正常连接成功的情况下,这个回调根本不会执行,所以里面的CREATE DATABASECREATE 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

火山引擎 最新活动