node.js判斷連接池是否正確連接上的兩種方法
在使用 mysql2/promise 的 createPool 時(shí),僅僅調(diào)用 createPool 是不會(huì)立即去連接數(shù)據(jù)庫(kù)的。它是“懶加載”的,只有在執(zhí)行第一次查詢或者手動(dòng)請(qǐng)求連接時(shí),才會(huì)真正嘗試建立連接。
要判斷連接是否正確以及數(shù)據(jù)庫(kù)是否存在,推薦以下兩種方式:
方法一:手動(dòng)獲取并釋放一個(gè)連接(推薦)
這是最標(biāo)準(zhǔn)的方法。通過調(diào)用 pool.getConnection(),你可以觸發(fā)一次真實(shí)的連接嘗試。
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 {
// 嘗試獲取一個(gè)連接
const connection = await pool.getConnection();
console.log('數(shù)據(jù)庫(kù)連接成功!');
// 釋放連接回連接池
connection.release();
return pool;
} catch (err) {
// 判斷錯(cuò)誤類型
if (err.code === 'ER_BAD_DB_ERROR') {
console.error('錯(cuò)誤:數(shù)據(jù)庫(kù)不存在!');
} else if (err.code === 'ER_ACCESS_DENIED_ERROR') {
console.error('錯(cuò)誤:用戶名或密碼錯(cuò)誤!');
} else if (err.code === 'ECONNREFUSED') {
console.error('錯(cuò)誤:無法連接到數(shù)據(jù)庫(kù)服務(wù)器(IP或端口錯(cuò)誤)!');
} else {
console.error('連接失敗,錯(cuò)誤代碼:' + err.code);
console.error(err.message);
}
return null;
}
}
const myPool = await checkConnection();方法二:執(zhí)行一個(gè)簡(jiǎn)單的測(cè)試查詢
如果你不想手動(dòng)獲取連接,可以直接執(zhí)行一個(gè)極簡(jiǎn)查詢(如 SELECT 1)。
try {
// 這種方式也會(huì)觸發(fā)一次連接請(qǐng)求
await pool.query('SELECT 1');
console.log('數(shù)據(jù)庫(kù)連接驗(yàn)證通過');
} catch (err) {
if (err.code === 'ER_BAD_DB_ERROR') {
console.error('數(shù)據(jù)庫(kù)不存在');
} else {
console.error('連接失敗:', err.message);
}
}如何識(shí)別“數(shù)據(jù)庫(kù)不存在”?
在 catch 塊中,你可以通過檢查 err.code 屬性來識(shí)別具體的錯(cuò)誤:
ER_BAD_DB_ERROR(錯(cuò)誤代碼: 1049): 表示你指定的database在服務(wù)器上不存在。ER_ACCESS_DENIED_ERROR(錯(cuò)誤代碼: 1045): 表示用戶名或密碼不對(duì)。ENOTFOUND/EAI_AGAIN: 表示host地址解析失敗。ECONNREFUSED: 表示數(shù)據(jù)庫(kù)服務(wù)沒啟動(dòng),或者端口號(hào)填錯(cuò)了。
進(jìn)階:如果數(shù)據(jù)庫(kù)不存在,自動(dòng)創(chuàng)建它
有時(shí)你希望程序啟動(dòng)時(shí)如果發(fā)現(xiàn)數(shù)據(jù)庫(kù)不存在,就自動(dòng)創(chuàng)建一個(gè)。這時(shí)候你創(chuàng)建 Pool 時(shí)不能指定 database,連接成功后再創(chuàng)建:
// 1. 先不指定數(shù)據(jù)庫(kù)連接到服務(wù)器
const poolWithoutDB = mysql.createPool({
host: configData.db_host,
user: configData.db_user,
password: configData.db_password
});
// 2. 執(zhí)行創(chuàng)建命令
await poolWithoutDB.query(`CREATE DATABASE IF NOT EXISTS \`${configData.db_database}\``);
// 3. 此時(shí)再關(guān)閉這個(gè) pool,或者直接切換到目標(biāo)數(shù)據(jù)庫(kù)使用
await poolWithoutDB.end();
// 4. 然后創(chuàng)建正式帶數(shù)據(jù)庫(kù)名的 pool
const pool = mysql.createPool({ ...configData });總結(jié)
要判斷連接情況,請(qǐng)?jiān)诔跏蓟罅⒖虉?zhí)行一次 await pool.getConnection(),并捕獲 err.code === 'ER_BAD_DB_ERROR' 來識(shí)別數(shù)據(jù)庫(kù)不存在的情況。
到此這篇關(guān)于node.js判斷連接池是否正確連接上的兩種方法的文章就介紹到這了,更多相關(guān)node.js判斷連接池是否正確連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析Node.js中使用依賴注入的相關(guān)問題及解決方法
這篇文章主要介紹了淺析Node.js中使用依賴注入的相關(guān)問題及解決方法,Node.js是一個(gè)將JavaScript應(yīng)用運(yùn)行于服務(wù)器端的框架,需要的朋友可以參考下2015-06-06
NodeJS父進(jìn)程與子進(jìn)程資源共享原理與實(shí)現(xiàn)方法
這篇文章主要介紹了NodeJS父進(jìn)程與子進(jìn)程資源共享原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了nodejs基于cluster模塊實(shí)現(xiàn)父進(jìn)程與子進(jìn)程資源共享的相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
nodejs微信開發(fā)之授權(quán)登錄+獲取用戶信息
這篇文章主要介紹了nodejs微信開發(fā)之授權(quán)登錄+獲取用戶信息,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
輕松開發(fā) Streamable HTTP MCP Server
本文介紹了MCP協(xié)議中stdio和SSE協(xié)議的優(yōu)缺點(diǎn),以及MCP的最新協(xié)議StreamableHTTP的特性,韓老師還分享了如何使用YeomanGeneratorforMCPServer快速開發(fā)一個(gè)支持StreamableHTTP的MCPServer,并在VSCode中進(jìn)行調(diào)試2025-05-05

