#node.js #mongodb #mongoose
#node.js #mongodb
Вопрос:
У меня возникла своего рода странная проблема, когда я пытаюсь установить единственное соединение mongodb с базой данных с помощью встроенного драйвера mongodb nodejs версии 3.6.0.
Моя идея состоит в том, чтобы открыть только одно соединение в течение всего сеанса клиента и повторно использовать его в разных маршрутах, которые у меня есть на моем экспресс-сервере, когда я нажимаю на него в первый раз, функция getDatabase создает два соединения, и после этого одно из них закрывается, а другое простаивает, но когда я использую маршрут, второе открывается снова (это похоже на то, что одно соединение просто остается там и ничего не делает).
Я просто хочу, чтобы в моем пуле было открыто одно соединение.
Если вы видите прокомментированный код, который я тестировал с этими опциями, но ни одна из них у меня не работала.
Pd: когда я устанавливаю для socketTimeoutMS значение 5000 мс, создается только одно соединение, но оно автоматически закрывается и повторно открывается каждые 5000 мс, что странно (оно снова открывается само, даже когда я не использую соединение).
Вся эта проблема возникает, когда я устанавливаю для useUnifiedTopology значение true (я не могу установить для него значение false, потому что оно устарело, а другие топологии будут удалены в следующей версии драйвера mdb ndjs)
Вот изображение со странным поведением
Код является:
import { MongoClient, Db } from 'mongodb';
import { DB_URI } from '../config/config';
// This mod works as DataBase Singleton
let db: Db;
export const getDataBase = async (id: string) => {
try {
if (db) {
console.log('ALREADY CREATED');
return db;
} else {
console.log('CREATING');
let client: MongoClient = await MongoClient.connect(`${DB_URI}DB_${id}`, {
useUnifiedTopology: true,
/* minPoolSize: 1,
maxPoolSize: 1,
socketTimeoutMS: 180000,
keepAlive: true,
maxIdleTimeMS:10000
useNewUrlParser: true,
keepAlive: true,
w: 'majority',
wtimeout: 5000,
serverSelectionTimeoutMS: 5000,
connectTimeoutMS: 8000,
appname: 'myApp',
*/
});
db = client.db();
return db;
}
} catch (error) {
console.log('DB Connection error', error);
}
};
Ответ №1:
Драйвер внутренне создает одно соединение для каждого известного сервера в целях мониторинга. Это соединение не используется для операций приложения.
Следовательно, ожидается, что вы получите два установленных соединения.
Комментарии:
1. Спасибо, я обнаружил это вчера, это ответ.