【MySQL】node.js 如何判断连接池是否正确连接上了?

在使用 mysql2/promisecreatePool 时,仅仅调用 createPool 是不会立即去连接数据库的。它是"懒加载"的,只有在执行第一次查询或者手动请求连接时,才会真正尝试建立连接。

要判断连接是否正确以及数据库是否存在,推荐以下两种方式:

方法一:手动获取并释放一个连接(推荐)

这是最标准的方法。通过调用 pool.getConnection(),你可以触发一次真实的连接尝试。

javascript 复制代码
import mysql from 'mysql2/promise';

async function checkConnection() {
    let pool = mysql.createPool({
        host: configData.db_host,
        user: configData.db_user,
        database: configData.db_database,
        password: configData.db_password,
        waitForConnections: true,
        connectionLimit: 10,
        queueLimit: 0
    });

    try {
        // 尝试获取一个连接
        const connection = await pool.getConnection();
        console.log('数据库连接成功!');
        
        // 释放连接回连接池
        connection.release();
        return pool;
    } catch (err) {
        // 判断错误类型
        if (err.code === 'ER_BAD_DB_ERROR') {
            console.error('错误:数据库不存在!');
        } else if (err.code === 'ER_ACCESS_DENIED_ERROR') {
            console.error('错误:用户名或密码错误!');
        } else if (err.code === 'ECONNREFUSED') {
            console.error('错误:无法连接到数据库服务器(IP或端口错误)!');
        } else {
            console.error('连接失败,错误代码:' + err.code);
            console.error(err.message);
        }
        return null;
    }
}

const myPool = await checkConnection();

方法二:执行一个简单的测试查询

如果你不想手动获取连接,可以直接执行一个极简查询(如 SELECT 1)。

javascript 复制代码
try {
    // 这种方式也会触发一次连接请求
    await pool.query('SELECT 1');
    console.log('数据库连接验证通过');
} catch (err) {
    if (err.code === 'ER_BAD_DB_ERROR') {
        console.error('数据库不存在');
    } else {
        console.error('连接失败:', err.message);
    }
}

如何识别"数据库不存在"?

catch 块中,你可以通过检查 err.code 属性来识别具体的错误:

  • ER_BAD_DB_ERROR (错误代码: 1049) : 表示你指定的 database 在服务器上不存在。
  • ER_ACCESS_DENIED_ERROR (错误代码: 1045): 表示用户名或密码不对。
  • ENOTFOUND / EAI_AGAIN : 表示 host 地址解析失败。
  • ECONNREFUSED: 表示数据库服务没启动,或者端口号填错了。

进阶:如果数据库不存在,自动创建它

有时你希望程序启动时如果发现数据库不存在,就自动创建一个。这时候你创建 Pool 时不能指定 database,连接成功后再创建:

javascript 复制代码
// 1. 先不指定数据库连接到服务器
const poolWithoutDB = mysql.createPool({
    host: configData.db_host,
    user: configData.db_user,
    password: configData.db_password
});

// 2. 执行创建命令
await poolWithoutDB.query(`CREATE DATABASE IF NOT EXISTS \`${configData.db_database}\``);

// 3. 此时再关闭这个 pool,或者直接切换到目标数据库使用
await poolWithoutDB.end();

// 4. 然后创建正式带数据库名的 pool
const pool = mysql.createPool({ ...configData });

总结

要判断连接情况,请在初始化后立刻执行一次 await pool.getConnection(),并捕获 err.code === 'ER_BAD_DB_ERROR' 来识别数据库不存在的情况。

相关推荐
0xDevNull4 小时前
MySQL数据冷热分离详解
后端·mysql
研究点啥好呢4 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb