Files
FastGPT/packages/service/common/mongo/init.ts
Archer 7bcee82f5f perf: memory leak (#5370)
* perf: memory leak

* perf: workflow share buffer;Circle checker;Get file from stream

* doc

* remove report.md
2025-08-03 22:37:45 +08:00

76 lines
1.9 KiB
TypeScript

import { delay } from '@fastgpt/global/common/system/utils';
import { addLog } from '../system/log';
import type { Mongoose } from 'mongoose';
const maxConnecting = Math.max(30, Number(process.env.DB_MAX_LINK || 20));
/**
* connect MongoDB and init data
*/
export async function connectMongo(db: Mongoose, url: string): Promise<Mongoose> {
/* Connecting, connected will return */
if (db.connection.readyState !== 0) {
return db;
}
const RemoveListeners = () => {
db.connection.removeAllListeners('error');
db.connection.removeAllListeners('disconnected');
};
console.log('MongoDB start connect');
try {
// Remove existing listeners to prevent duplicates
RemoveListeners();
db.set('strictQuery', 'throw');
db.connection.on('error', async (error) => {
console.log('mongo error', error);
try {
if (db.connection.readyState !== 0) {
RemoveListeners();
await db.disconnect();
await delay(1000);
await connectMongo(db, url);
}
} catch (error) {}
});
db.connection.on('disconnected', async () => {
console.log('mongo disconnected');
try {
if (db.connection.readyState !== 0) {
RemoveListeners();
await db.disconnect();
await delay(1000);
await connectMongo(db, url);
}
} catch (error) {}
});
const options = {
bufferCommands: true,
maxConnecting: maxConnecting,
maxPoolSize: maxConnecting,
minPoolSize: 20,
connectTimeoutMS: 60000,
waitQueueTimeoutMS: 60000,
socketTimeoutMS: 60000,
maxIdleTimeMS: 300000,
retryWrites: true,
retryReads: true
};
db.connect(url, options);
console.log('mongo connected');
return db;
} catch (error) {
addLog.error('Mongo connect error', error);
await db.disconnect();
await delay(1000);
return connectMongo(db, url);
}
}