From c11bae69335acbc7fea67a3ef7ef2a932b7b4599 Mon Sep 17 00:00:00 2001 From: Le Nguyen Quang Minh <101281380+lnqminh3003@users.noreply.github.com> Date: Sat, 15 Nov 2025 21:22:02 -0700 Subject: [PATCH 1/5] fix-timeout-of-mongo --- shatter-backend/api/index.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/shatter-backend/api/index.ts b/shatter-backend/api/index.ts index 37d27db..587a30f 100644 --- a/shatter-backend/api/index.ts +++ b/shatter-backend/api/index.ts @@ -4,11 +4,12 @@ import app from '../src/app'; const MONGODB_URI = process.env.MONGO_URI; +mongoose.set('bufferCommands', false); + let isConnected = false; async function connectDB() { if (isConnected && mongoose.connection.readyState === 1) { - console.log('Using existing MongoDB connection'); return; } @@ -17,44 +18,44 @@ async function connectDB() { } try { - console.log('Creating new MongoDB connection...'); - await mongoose.connect(MONGODB_URI, { bufferCommands: false, maxPoolSize: 10, + minPoolSize: 2, + maxIdleTimeMS: 30000, serverSelectionTimeoutMS: 5000, socketTimeoutMS: 45000, }); isConnected = true; - console.log('MongoDB connected successfully'); mongoose.connection.on('error', (err) => { - console.error('MongoDB connection error:', err); isConnected = false; }); mongoose.connection.on('disconnected', () => { - console.log('MongoDB disconnected'); isConnected = false; }); } catch (error) { - console.error('Failed to connect to MongoDB:', error); isConnected = false; throw error; } } +connectDB().catch(console.error); + app.use(async (req, res, next) => { try { + if (mongoose.connection.readyState === 1) { + return next(); + } await connectDB(); next(); } catch (error: any) { - console.error('Database connection error:', error); res.status(500).json({ error: 'Database connection failed', - details: process.env.NODE_ENV === 'development' ? error.message : undefined + message: error.message }); } }); From 5dd7ca53b1229c890d9ca41798dec4a9f801b3cf Mon Sep 17 00:00:00 2001 From: Le Nguyen Quang Minh <101281380+lnqminh3003@users.noreply.github.com> Date: Sat, 15 Nov 2025 21:30:19 -0700 Subject: [PATCH 2/5] fix multiple requests at cold start progress --- shatter-backend/api/index.ts | 56 ++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/shatter-backend/api/index.ts b/shatter-backend/api/index.ts index 587a30f..d857984 100644 --- a/shatter-backend/api/index.ts +++ b/shatter-backend/api/index.ts @@ -6,50 +6,56 @@ const MONGODB_URI = process.env.MONGO_URI; mongoose.set('bufferCommands', false); -let isConnected = false; +let connectionPromise: Promise | null = null; async function connectDB() { - if (isConnected && mongoose.connection.readyState === 1) { + if (mongoose.connection.readyState === 1) { return; } + if (connectionPromise) { + return connectionPromise; + } + if (!MONGODB_URI) { throw new Error('MONGO_URI is not set in environment variables'); } - try { - await mongoose.connect(MONGODB_URI, { - bufferCommands: false, - maxPoolSize: 10, - minPoolSize: 2, - maxIdleTimeMS: 30000, - serverSelectionTimeoutMS: 5000, - socketTimeoutMS: 45000, - }); + connectionPromise = (async () => { + try { + await mongoose.connect(MONGODB_URI, { + bufferCommands: false, + maxPoolSize: 10, + minPoolSize: 2, + maxIdleTimeMS: 30000, + serverSelectionTimeoutMS: 5000, + socketTimeoutMS: 45000, + }); - isConnected = true; + mongoose.connection.on('error', (err) => { + console.error('MongoDB connection error:', err); + connectionPromise = null; + }); - mongoose.connection.on('error', (err) => { - isConnected = false; - }); + mongoose.connection.on('disconnected', () => { + console.log('MongoDB disconnected'); + connectionPromise = null; + }); - mongoose.connection.on('disconnected', () => { - isConnected = false; - }); + } catch (error) { + console.error('Failed to connect to MongoDB:', error); + connectionPromise = null; + throw error; + } + })(); - } catch (error) { - isConnected = false; - throw error; - } + return connectionPromise; } connectDB().catch(console.error); app.use(async (req, res, next) => { try { - if (mongoose.connection.readyState === 1) { - return next(); - } await connectDB(); next(); } catch (error: any) { From 9c4df7837ab4277ba380878849c0a12f4f3f0206 Mon Sep 17 00:00:00 2001 From: Le Nguyen Quang Minh <101281380+lnqminh3003@users.noreply.github.com> Date: Sat, 15 Nov 2025 22:09:12 -0700 Subject: [PATCH 3/5] handle disconnect mongoDB --- shatter-backend/api/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/shatter-backend/api/index.ts b/shatter-backend/api/index.ts index d857984..1a63bf5 100644 --- a/shatter-backend/api/index.ts +++ b/shatter-backend/api/index.ts @@ -13,6 +13,11 @@ async function connectDB() { return; } + if (mongoose.connection.readyState !== 0) { + await mongoose.disconnect(); + connectionPromise = null; + } + if (connectionPromise) { return connectionPromise; } From 54aadace5a35d1662900ac469a8b8089d80e5f26 Mon Sep 17 00:00:00 2001 From: Le Nguyen Quang Minh <101281380+lnqminh3003@users.noreply.github.com> Date: Sat, 15 Nov 2025 22:43:30 -0700 Subject: [PATCH 4/5] remove buffer commands --- shatter-backend/api/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/shatter-backend/api/index.ts b/shatter-backend/api/index.ts index 1a63bf5..c06782e 100644 --- a/shatter-backend/api/index.ts +++ b/shatter-backend/api/index.ts @@ -29,7 +29,6 @@ async function connectDB() { connectionPromise = (async () => { try { await mongoose.connect(MONGODB_URI, { - bufferCommands: false, maxPoolSize: 10, minPoolSize: 2, maxIdleTimeMS: 30000, From 7cbdeb8e1ebdbf513589e194f6e730301a062b34 Mon Sep 17 00:00:00 2001 From: Le Nguyen Quang Minh <101281380+lnqminh3003@users.noreply.github.com> Date: Sat, 15 Nov 2025 22:55:25 -0700 Subject: [PATCH 5/5] remove bufferCommands --- shatter-backend/api/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/shatter-backend/api/index.ts b/shatter-backend/api/index.ts index c06782e..655999c 100644 --- a/shatter-backend/api/index.ts +++ b/shatter-backend/api/index.ts @@ -4,8 +4,6 @@ import app from '../src/app'; const MONGODB_URI = process.env.MONGO_URI; -mongoose.set('bufferCommands', false); - let connectionPromise: Promise | null = null; async function connectDB() {