商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > node.js判断连接池是否正确连接上的两种方法

node.js判断连接池是否正确连接上的两种方法

  发布于2026-07-23 阅读(0)

扫一扫,手机访问

使用 mysql2/promisecreatePool 时,可别以为一调用它就立刻连上数据库了。实际上,它是“懒加载”的——只有在真正执行第一次查询或者手动请求连接时,才会尝试建立连接。那么,怎么判断连接是否正常,尤其是数据库到底存不存在呢?下面两种方式可以解决这个问题。

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

最标准的做法是通过 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' 来识别数据库不存在的情况。这样既能验证连接,又能区分具体错误,省去不少排查的麻烦。

本文转载于:https://www.jb51.net/javascript/3565174m4.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注