initial commit
This commit is contained in:
87
lib/mongodb.ts
Normal file
87
lib/mongodb.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import mongoose from 'mongoose'
|
||||
|
||||
const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/siliconpin'
|
||||
|
||||
if (!MONGODB_URI) {
|
||||
throw new Error('Please define the MONGODB_URI environment variable inside .env.local')
|
||||
}
|
||||
|
||||
interface CachedConnection {
|
||||
conn: typeof mongoose | null
|
||||
promise: Promise<typeof mongoose> | null
|
||||
}
|
||||
|
||||
// Global variable to cache the database connection across hot reloads in development
|
||||
declare global {
|
||||
var mongoose: CachedConnection | undefined
|
||||
}
|
||||
|
||||
let cached: CachedConnection = global.mongoose || { conn: null, promise: null }
|
||||
|
||||
if (!global.mongoose) {
|
||||
global.mongoose = cached
|
||||
}
|
||||
|
||||
async function connectDB(): Promise<typeof mongoose> {
|
||||
// Skip database connection during build phase
|
||||
const isBuildTime = process.env.NEXT_PHASE === 'phase-production-build'
|
||||
if (isBuildTime) {
|
||||
throw new Error('Database connection skipped during build phase')
|
||||
}
|
||||
|
||||
if (cached.conn) {
|
||||
return cached.conn
|
||||
}
|
||||
|
||||
if (!cached.promise) {
|
||||
const opts = {
|
||||
bufferCommands: false,
|
||||
maxPoolSize: 10,
|
||||
minPoolSize: 5,
|
||||
socketTimeoutMS: 45000,
|
||||
connectTimeoutMS: 10000,
|
||||
serverSelectionTimeoutMS: 10000,
|
||||
}
|
||||
|
||||
cached.promise = mongoose.connect(MONGODB_URI, opts)
|
||||
}
|
||||
|
||||
try {
|
||||
cached.conn = await cached.promise
|
||||
console.log('Connected to MongoDB')
|
||||
return cached.conn
|
||||
} catch (error) {
|
||||
cached.promise = null
|
||||
console.error('MongoDB connection error:', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
// Test MongoDB connection
|
||||
export async function testMongoConnection(): Promise<boolean> {
|
||||
try {
|
||||
const connection = await connectDB()
|
||||
|
||||
// Test database operations
|
||||
await connection.connection.db.admin().ping()
|
||||
console.log('✅ MongoDB connection test successful')
|
||||
|
||||
// Optional: Test if we can create a test collection
|
||||
const testCollection = connection.connection.db.collection('connection_test')
|
||||
await testCollection.insertOne({ test: true, timestamp: new Date() })
|
||||
await testCollection.deleteOne({ test: true })
|
||||
|
||||
console.log('✅ MongoDB read/write test successful')
|
||||
return true
|
||||
} catch (error) {
|
||||
console.error('❌ MongoDB connection test failed:', error)
|
||||
console.error('Please check:')
|
||||
console.error('1. MongoDB is running (docker-compose up -d in /mongo directory)')
|
||||
console.error('2. MONGODB_URI in .env is correct')
|
||||
console.error('3. MongoDB credentials are valid')
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
export default connectDB
|
||||
export { connectDB }
|
||||
Reference in New Issue
Block a user