发布于2026-07-23 阅读(0)
扫一扫,手机访问
使用 mysql2/promise 的 createPool 时,可别以为一调用它就立刻连上数据库了。实际上,它是“懒加载”的——只有在真正执行第一次查询或者手动请求连接时,才会尝试建立连接。那么,怎么判断连接是否正常,尤其是数据库到底存不存在呢?下面两种方式可以解决这个问题。
最标准的做法是通过 pool.getConnection() 触发一次真实的连接尝试。拿到连接后记得释放,不然连接池会一直占用资源。
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)也能触发连接请求。
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,等连接成功后再说:
// 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. 然后创建正式带数据库名的 poolconst pool = mysql.createPool({ ...configData });
想判断连接是否正常,最稳妥的方式是在初始化后立刻执行一次 await pool.getConnection(),并捕获 err.code === 'ER_BAD_DB_ERROR' 来识别数据库不存在的情况。这样既能验证连接,又能区分具体错误,省去不少排查的麻烦。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8