Avatar ·

Как убрать предупреждение "current URL string parser is deprecated" в Mongoose с TypeScript

Всем привет! Я пишу бэкенд на Express с TypeScript и использую MongoDB через Mongoose. При подключении к базе данных я получаю в консоли такое предупреждение: ``` (node:12345) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect. ``` Я уже пытался добавить `useNewUrlParser: true` в options, но всё равно вижу это сообщение. Вот мой код: ```typescript import mongoose from 'mongoose'; import { config } from './config'; const connectDB = async (): Promise => { try { await mongoose.connect(config.mongoURI, { useNewUrlParser: true, useUnifiedTopology: true, }); console.log('MongoDB connected successfully'); } catch (error) { console.error('MongoDB connection error:', error); process.exit(1); } }; export default connectDB; ``` Версии: - mongoose: 6.0.0 - typescript: 4.5.0 - node: 16.13.0 Почему предупреждение всё ещё появляется? Я что-то делаю не так? Может быть, проблема в версии Mongoose или я неправильно передаю опции? Буду благодарен за помощь! <<>>

Проблема в устаревших опциях

Вы столкнулись с типичной ситуацией для разработчиков, которые обновляют 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 и убрать устаревшие опции.