人生像一场梦 發表於 2026-1-10 09:28:53

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">方法一:手动获取并释放一个连接(推荐)</a></li><li><a href="#_label1">方法二:执行一个简单的测试查询</a></li><li><a href="#_label2">如何识别&ldquo;数据库不存在&rdquo;?</a></li><li><a href="#_label3">进阶:如果数据库不存在,自动创建它</a></li><li><a href="#_label4">总结</a></li></ul></div><p>在使用 <code>mysql2/promise</code> 的 <code>createPool</code> 时,仅仅调用 <code>createPool</code> 是不会立即去连接数据库的。它是&ldquo;懒加载&rdquo;的,只有在执行第一次查询或者手动请求连接时,才会真正尝试建立连接。</p>
<p>要判断连接是否正确以及数据库是否存在,推荐以下两种方式:</p>
<p class="maodian"><a name="_label0"></a></p><h2>方法一:手动获取并释放一个连接(推荐)</h2>
<p>这是最标准的方法。通过调用 <code>pool.getConnection()</code>,你可以触发一次真实的连接尝试。</p>
<div class="jb51code"><pre class="brush:js;">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();</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>方法二:执行一个简单的测试查询</h2>
<p>如果你不想手动获取连接,可以直接执行一个极简查询(如 <code>SELECT 1</code>)。</p>
<div class="jb51code"><pre class="brush:js;">try {
    // 这种方式也会触发一次连接请求
    await pool.query('SELECT 1');
    console.log('数据库连接验证通过');
} catch (err) {
    if (err.code === 'ER_BAD_DB_ERROR') {
      console.error('数据库不存在');
    } else {
      console.error('连接失败:', err.message);
    }
}</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>如何识别&ldquo;数据库不存在&rdquo;?</h2>
<p>在 <code>catch</code> 块中,你可以通过检查 <code>err.code</code> 属性来识别具体的错误:</p>
<ul><li><code>ER_BAD_DB_ERROR</code> (错误代码: 1049): 表示你指定的 <code>database</code> 在服务器上不存在。</li><li><code>ER_ACCESS_DENIED_ERROR</code> (错误代码: 1045): 表示用户名或密码不对。</li><li><code>ENOTFOUND</code> / <code>EAI_AGAIN</code>: 表示 <code>host</code> 地址解析失败。</li><li><code>ECONNREFUSED</code>: 表示数据库服务没启动,或者端口号填错了。</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>进阶:如果数据库不存在,自动创建它</h2>
<p>有时你希望程序启动时如果发现数据库不存在,就自动创建一个。这时候你<strong>创建 Pool 时不能指定 database</strong>,连接成功后再创建:</p>
<div class="jb51code"><pre class="brush:js;">// 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 });</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
<p>要判断连接情况,请在初始化后立刻执行一次 <code>await pool.getConnection()</code>,并捕获 <code>err.code === &#39;ER_BAD_DB_ERROR&#39;</code> 来识别数据库不存在的情况。</p>
頁: [1]
查看完整版本: node.js判断连接池是否正确连接上的两种方法