Как убрать предупреждение "current URL string parser is deprecated" в Mongoose с TypeScript
Проблема в устаревших опциях
Вы столкнулись с типичной ситуацией для разработчиков, которые обновляют Mongoose с версии 5.x до 6.x. В Mongoose 6.0.0 парсер URL по умолчанию был изменён, и опции useNewUrlParser и useUnifiedTopology стали устаревшими. Их больше не нужно передавать — новый парсер используется автоматически.
Более того, передача этих опций в Mongoose 6+ вызывает предупреждение, которое вы видите. Решение очень простое: удалите эти опции из вызова mongoose.connect().
Правильное решение для Mongoose 6+
import mongoose from 'mongoose';
import { config } from './config';
const connectDB = async (): Promise<void> => {
try {
// В Mongoose 6+ не нужно передавать useNewUrlParser и useUnifiedTopology
await mongoose.connect(config.mongoURI);
console.log('MongoDB connected successfully');
} catch (error) {
console.error('MongoDB connection error:', error);
process.exit(1);
}
};
export default connectDB;
Что изменилось в Mongoose 6?
- useNewUrlParser — удалён. Новый парсер URL теперь используется по умолчанию.
- useUnifiedTopology — удалён. Единая топология теперь применяется по умолчанию.
- useCreateIndex — удалён. Вместо него используйте явное создание индексов через схему.
- useFindAndModify — удалён. Методы
findOneAndUpdateиfindOneAndDeleteтеперь используют нативные драйверы MongoDB.
Полный пример с TypeScript и обработкой ошибок
import mongoose, { ConnectOptions } from 'mongoose';
import { config } from './config';
const connectDB = async (): Promise<void> => {
try {
const connectionOptions: ConnectOptions = {
// Здесь можно указать только актуальные опции:
// maxPoolSize: 10,
// serverSelectionTimeoutMS: 5000,
// socketTimeoutMS: 45000,
};
await mongoose.connect(config.mongoURI, connectionOptions);
console.log('MongoDB connected successfully');
mongoose.connection.on('error', (err) => {
console.error('MongoDB connection error:', err);
});
mongoose.connection.on('disconnected', () => {
console.log('MongoDB disconnected');
});
} catch (error) {
console.error('Initial MongoDB connection failed:', error);
process.exit(1);
}
};
export default connectDB;
Если вы всё ещё используете Mongoose 5.x
Если по каким-то причинам вы застряли на старой версии, тогда опции действительно нужны:
// Только для Mongoose 5.x
await mongoose.connect(config.mongoURI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true, // для создания индексов
useFindAndModify: false, // для новых методов findOneAndUpdate
});
Проверка версии Mongoose
Чтобы убедиться, какая версия у вас установлена, выполните в терминале:
npm list mongoose
Или в коде:
console.log(mongoose.version); // Выведет версию, например "6.0.0"
После удаления устаревших опций предупреждение должно исчезнуть. Если оно остаётся — проверьте, нет ли других мест в коде, где вы вызываете mongoose.connect() или используете MongoClient напрямую.
Альтернативный подход: использование MongoClient напрямую
Если вы предпочитаете работать с драйвером MongoDB на более низком уровне, можно использовать MongoClient вместо Mongoose. Это даёт больше контроля над подключением и позволяет явно указать парсер URL.
import { MongoClient } from 'mongodb';
import { config } from './config';
const client = new MongoClient(config.mongoURI, {
// В драйвере mongodb версии 4+ эти опции всё ещё актуальны
// для обратной совместимости
});
const connectDB = async (): Promise<void> => {
try {
await client.connect();
console.log('Connected to MongoDB via MongoClient');
const db = client.db('mydatabase');
// Работайте с коллекциями напрямую
const users = db.collection('users');
} catch (error) {
console.error('Connection failed:', error);
}
};
export { client, connectDB };
Когда это может быть полезно?
- Вы работаете с очень большими объёмами данных и нуждаетесь в тонкой настройке подключения.
- Вы хотите избежать "магии" Mongoose и полностью контролировать запросы.
- У вас legacy-код, который сложно мигрировать на новую версию Mongoose.
Однако имейте в виду: отказ от Mongoose лишает вас удобных функций вроде схем, валидации, middleware и популяции (population). Для большинства проектов лучше просто обновить Mongoose и убрать устаревшие опции.