今天就來細探 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