在使用 mysql2/promise 的 createPool 时,仅仅调用 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' 来识别数据库不存在的情况。