Node.js MongoDB:Mongoose 連線配置與最佳實踐
Node.js 與 MongoDB (NoSQL) 是業界最經典的組合之一。雖然可以使用原生的 MongoDB Driver,但目前最主流的做法是使用 Mongoose (ODM),它能提供強大的 Schema 定義、驗證與中介軟體功能,讓資料互動變得更有結構。
為什麼選擇 Mongoose?
- Schema 式管理:解決 NoSQL 資料過於「隨意」的問題,確保資料一致性。
- 內建校驗器:在資料存入資料庫前,進行精確的格式轉換與邏輯檢查。
- 優雅的 Query 鏈:提供比原生語法更具語義化的查詢方式。
基礎實戰:建立連線
首先安裝套件:npm install mongoose。
建議將資料庫連線分離成一個獨立的模組,或是使用環境變數來管理敏感的連線字串。
const mongoose = require('mongoose');
require('dotenv').config();
// 從環境變數讀取連線字串
const DB_URI = process.env.DATABASE_URL || 'mongodb://127.0.0.1:27017/myapp';
const connectDB = async () => {
try {
await mongoose.connect(DB_URI, {
// 現代 Mongoose 已不需傳遞以前的 useNewUrlParser 等參數
maxPoolSize: 10, // 設定連線池大小,提升高併發性能
});
console.log('✅ MongoDB 資料庫連線成功');
} catch (err) {
console.error('❌ 資料庫連線失敗:', err.message);
process.exit(1); // 嚴重錯誤,強制中斷應用程序
}
};
module.exports = connectDB;
監聽連線事件 (Event Listeners)
監聽事件能讓你更即時地處理連線異常或自動重連:
const db = mongoose.connection;
db.on('connected', () => console.log('Mongoose 已連線'));
db.on('error', (err) => console.log('Mongoose 連線錯誤:', err));
db.on('disconnected', () => console.log('Mongoose 已中斷連線'));
專業部署建議:優雅關閉 (Graceful Shutdown)
當你的運維系統(如 PM2 或 Docker)嘗試重啟伺服器時,程序應該先中斷資料庫連線,確保所有操作都已完整寫入。
// 當接收到中斷訊號時執行
process.on('SIGINT', async () => {
await mongoose.connection.close();
console.log('資料庫連線已安全關閉');
process.exit(0);
});
連線 Atlas (雲端版) 提醒
如果你使用的是 MongoDB Atlas 雲端資料庫,你的連線字串會是 mongodb+srv://... 格式。務必在 Atlas 控制台的 Network Access 中將伺服器的 IP 加入白名單,否則連線會被防火牆擋掉。
總結
- 環境變數 是管理
DB_URI的唯一正確方式。 - 透過
maxPoolSize與socketTimeoutMS等配置項來調優正式環境性能。 - 務必實作 優雅關閉 邏輯,保護資料的完整性。