MongoClient.connect не отвечает

Я пытаюсь связать свой Node.js (Express) с моим атласом MongoDB, следуя официальному руководству на их веб-сайте.

Вот мой код conn.js ниже:

const { MongoClient } = require("mongodb");
const Db = process.env.ATLAS_URI;

let _db;

module.exports = {
  connectToServer: function (callback) {
    MongoClient.connect(
      Db,
      { useNewUrlParser: true, useUnifiedTopology: true },
      (err, db) => {
        console.info('THIS LOG IS NOT DISPLAYED')
        if (db) {
          _db = db.db("employees");
          console.info("Successfully connected to MongoDB");
        }
        return callback(err);
      }
    );
  },

  getDb: function () {
    return _db;
  },
};

Вот server.js, где я вызываю функцию connectToServer() из conn.js

const express = require("express");
const app = express();

const cors = require("cors");
require("dotenv").config({ path: "./config.env" });

const port = process.env.PORT || 5000;

app.use(cors());
app.use(express.json());
app.use(require("./routes/record"));
const dbo = require("./db/conn");
 
app.listen(port, () => {
  // HERE IS WHERE I CALL THE FUNCTION
  dbo.connectToServer(err => {
    if (err) console.error(err);
  });
  console.info(`Server is running on port: ${port}`);
});

Обратите внимание, что я получаю сообщение «Сервер работает на порту: 5000», но я не получаю сообщение «Успешно подключено к MongoDB», и я также не получаю никаких ошибок.

P.S. Я сделал доступ к сети MongoDB 0.0.0.0, чтобы любой IP-адрес мог получить к нему доступ. А также, если я укажу неправильное имя пользователя и пароль для моего ATLAS_URI, я получаю ошибку аутентификации.

🤔 А знаете ли вы, что...
Node.js имеет огромное количество библиотек и модулей, доступных через npm (Node Package Manager).


1
65
2

Ответы:

Решено

Connect возвращает обещание, которое вы можете использовать, как показано ниже.

let _db;
const client = new MongoClient(Db, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

module.exports = {
  connectToServer: async (callback) => {
    await client.connect();
    console.info("Connected successfully to server");
    _db = client.db(dbName);
    console.info("Successfully connected to MongoDB");
  },

  getDb: function () {
    return _db;
  },
};

Примечание. Вы можете изменить порядок. Если хотите, сначала подключитесь к базе данных, а затем запустите сервер. Это совершенно необязательно в зависимости от варианта использования.

(async () => {
  try {
    await dbo.connectToServer();
    app.listen(port, async () => {
      // HERE IS WHERE I CALL THE FUNCTION
      console.info(`Server is running on port: ${port}`);
    });
  } catch (error) {
    console.info(error);
  }
})();

Поддержка обратного вызова была удалена из v5, поэтому операторы console.info в функции обратного вызова не печатаются. Чтобы заставить его работать, вы можете использовать promises/async-await. По той же причине возникает ошибка, когда аутентификация неверна, поскольку функция подключения работает, но в этом случае происходит сбой.

Лог изменений на такой же. => «Драйвер Node.js v5 отказывается от поддержки обратных вызовов в пользу API только для Promise».