今天就來細探 Claude 幫我生成的 connection.js 檔案。
這也是我初次使用 MongoDB,過程中發現了不少實用的小技巧。
const mongoose = require('mongoose');
Mongoose 是一個 ODM(Object Data Modeling)套件,讓我們可以用 JavaScript 物件的方式操作 MongoDB,而不用直接寫查詢語法。
const connectDatabase = async () => {
  try {
    const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/rehab_tracker';
mongoUri:指定資料庫連線字串。
預設是 mongodb://localhost:27017/rehab_tracker(本地端 MongoDB)。
如果專案部署到雲端(例如 MongoDB Atlas),就會用環境變數 MONGODB_URI。
const options = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  maxPoolSize: 10,              // 最多維持 10 個連線
  serverSelectionTimeoutMS: 5000, // 伺服器選擇逾時 5 秒
  socketTimeoutMS: 45000,       // 45 秒沒動作就關閉 socket
  family: 4                     // 強制使用 IPv4
};
選項用途
相容性:useNewUrlParser, useUnifiedTopology
確保使用新版行為,避免舊版警告。
效能:maxPoolSize
控制連線池大小,避免過多連線浪費資源。
錯誤處理:serverSelectionTimeoutMS, socketTimeoutMS
避免查詢卡住不回應。
網路設定:family: 4
強制 IPv4,避免 IPv6 連線失敗造成延遲。
const connection = await mongoose.connect(mongoUri, options);
成功的話,connection 就是連線物件,接下來可以監聽事件。
mongoose.connection.on('connected', () => {
  console.log('✅ Mongoose connected to MongoDB');
});
mongoose.connection.on('error', (err) => {
  console.error('❌ Mongoose connection error:', err);
});
mongoose.connection.on('disconnected', () => {
  console.log('⚠️  Mongoose disconnected from MongoDB');
});
connected → 連線成功
error → 發生錯誤
disconnected → 連線中斷
讓我們能在 log 中清楚追蹤 DB 狀態。
process.on('SIGINT', async () => {
  try {
    await mongoose.connection.close();
    console.log('Mongoose connection closed through app termination');
    process.exit(0);
  } catch (error) {
    console.error('Error closing mongoose connection:', error);
    process.exit(1);
  }
});
這段程式的重點在「優雅關閉」:
Ctrl + C 結束程式時,先關閉 MongoDB 連線,再結束程式。
避免遺留 zombie connection 造成資源浪費。
const closeDatabase = async () => {
  await mongoose.connection.close();
  console.log('Database connection closed successfully');
};
const isConnected = () => {
  return mongoose.connection.readyState === 1;
};
closeDatabase → 主動關閉連線。
isConnected → 檢查是否已連線(回傳布林值)。
readyState 對照表
| 值 | 狀態 | 
|---|---|
| 0 | disconnected | 
| 1 | connected | 
| 2 | connecting | 
| 3 | disconnecting | 
module.exports = {
  connectDatabase,
  closeDatabase,
  isConnected
};
讓其他檔案能直接 require('./database') 使用。
實務上可能遇到 MongoDB 尚未啟動,這時候可以設計重試機制:
const connectWithRetry = async (retries = 3) => {
  for (let i = 0; i < retries; i++) {
    try {
      await connectDatabase();
      console.log('✅ MongoDB connected');
      break;
    } catch (err) {
      console.error(`Connection failed, retrying (${i + 1}/${retries})...`);
      await new Promise(r => setTimeout(r, 2000));
    }
  }
};
📂 .env 管理小提醒
.env 應該放在 .gitignore,避免洩漏敏感資訊。
可以提供 .env.example 方便其他人快速建立設定。
🧪 連線測試範例
(async () => {
  await connectDatabase();
  if (isConnected()) {
    console.log('MongoDB is ready to use!');
  }
})();
✅ 總結
這段程式碼實現了:
統一的資料庫連線管理(connectDatabase)
錯誤與狀態監聽(connected, error, disconnected)
優雅關閉(closeDatabase 與 SIGINT handler)
檢查連線狀態(isConnected)
延伸補充:重試機制、環境變數管理、連線測試
這樣就完成了 Rehab Tracker 專案中最基礎的資料庫連線設定 🎉
專案Github Repo : https://github.com/CHING-WENLAI1031/Rehab_Tracker