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 加入白名單,否則連線會被防火牆擋掉。

總結

  1. 環境變數 是管理 DB_URI 的唯一正確方式。
  2. 透過 maxPoolSizesocketTimeoutMS 等配置項來調優正式環境性能。
  3. 務必實作 優雅關閉 邏輯,保護資料的完整性。