Проект на Node с MongoDB никогда не загружается на определённых маршрутах.

Вопрос или проблема

Я создавал небольшой API для практики, но у меня возникают проблемы с получением данных из коллекции моей базы данных Mongodb. Когда я открываю определенный маршрут, контроллер, похоже, ничего не отправляет, и API загружается бесконечно без ответа.

База данных подключается, когда я запускаю проект на node, и она выдает мне сообщение о том, что подключение установлено. Однако, когда я пробую маршрут, такой как /authors, ответа никогда не приходит, даже ошибки не появляется, поэтому я не могу понять, в чем дело, и он продолжает загружаться бесконечно без ответа. Я сделал аналогичный API для учебных целей, и он работает идеально. Я не знаю, что происходит с этим. Моя переменная окружения содержит имя коллекции в URI.

Вот мой код

    const express = require('express');
    const mongodb = require('./db/connect');
    const app = express();
    const bodyParser = require('body-parser');

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

    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use("https://stackoverflow.com/", require('./routes'));

    process.on('uncaughtException', (err, origin) => {
      console.log(
        process.stderr.fd,
        `Поймано исключение: ${err}\n` + `Происхождение исключения: ${origin}`
      );
    });

    mongodb.initDb((err) => {
      if (err) {
        console.log('Не удалось подключиться к базе данных');
      } else {
        app.listen(port);
        console.log(`Подключено к БД и слушает на порту ${port}`);
      }
    });

    db connect.js
    const dotenv = require('dotenv');
    dotenv.config();
    const MongoClient = require('mongodb').MongoClient;

    let _db;

    const initDb = (callback) => {
      if (_db) {
        console.log('База данных уже инициализирована!');
        return callback(null, _db);
      }
      MongoClient.connect(process.env.MONGODB_URI)
        .then((client) => {
          _db = client;
          callback(null, _db);
        })
        .catch((err) => {
          callback(err);
        });
    };

    const getDb = () => {
      if (!_db) {
        throw Error('База данных не инициализирована');
      }
      return _db;
    };

    module.exports = {
      initDb,
      getDb,
    };

    routes index.js
    const express = require('express');
    const router = express.Router();

    router.get("https://stackoverflow.com/", (req, res) => {
      res.send('Работаю');
    });

    router.use('/authors', require('./authors'));

    module.exports = router;

    routes authors.js
    const express = require('express');
    const router = express.Router();
    const authorsController = require('../controllers/authorsController');

    router.get("https://stackoverflow.com/", authorsController.getAll);
    /*router.get('/:id', authorsController.getAuthorById);
    router.get('/:id/books', authorsController.getAuthorBooks);
    router.post("https://stackoverflow.com/", authorsController.addNewAuthor);
    router.put('/:id', authorsController.updateAuthorInfo);
    router.delete('/:id', authorsController.deleteAuthor);*/

    module.exports = router;

    controllers authorsController
    const mongodb = require('../db/connect');
    const ObjectId = require('mongodb').ObjectId;

    const getAll = async (req, res) => {
      const result = await mongodb.getDb().db().collection('authors').find();
      result.toArray((err, lists) => {
        if (err) {
          res.status(400).json({ message: err });
        }
        res.setHeader('Content-Type', 'application/json');
        res.status(200).json(lists);
      });
    };

    const getAuthorById = async (req, res) => {
      if (!ObjectId.isValid(req.params.id)) {
        res.status(400).json('ID автора недействителен');
      }
      const userId = req.params.id;
      const result = await mongodb
        .getDb()
        .db()
        .collection('authors')
        .find({ _id: userId });
      result.toArray((err, lists) => {
        if (condition) {
          res.status(400).json({ message: err });
        }
        res.setHeader('Content-Type', 'application/json');
        res.status(200).json(lists);
      });
    };

    module.exports = {
      getAll,
      getAuthorById,
    };```

это мои зависимости в package json
```      "dependencies": {
        "body-parser": "^1.20.3",
        "dotenv": "^16.4.5",
        "express": "^4.21.1",
        "mongodb": "^6.9.0",
        "nodemon": "^3.1.7"
      }```

Ответ или решение

Проблема с загрузкой маршрутов в Node.js проекте с MongoDB: причины и решения

Вы столкнулись с проблемой, когда ваше API на Node.js, использующее MongoDB, не загружает данные на определённых маршрутах, в частности, при вызове маршрута /authors. Это может происходить по различным причинам. Давайте разберёмся в ключевых аспектах указанного кода и выявим возможные проблемы.

1. Неверное определение путей маршрутов

В вашем коде пути маршрутов определены неверно. Вместо использования правильного синтаксиса Express, вы указали URL-адреса:

// Неверное определение пути
router.get("https://stackoverflow.com/", (req, res) => {
  res.send('Running');
});
// ...
router.get("https://stackoverflow.com/", authorsController.getAll);

Решение: Используйте относительные пути. Например, для маршрута /:

router.get("/", (req, res) => {
  res.send('Running');
});

И для /authors в файле authors.js:

router.get("/", authorsController.getAll);

2. Обработка ошибок в асинхронных функциях

В функции getAll в authorsController отсутствует обработка ошибок. Если происходит ошибка при выполнении запроса к базе данных, ответ всё ещё будет возвращён с кодом 200.

Решение: Добавьте обработку ошибок:

const getAll = async (req, res) => {
  try {
    const result = await mongodb.getDb().db().collection('authors').find();
    const lists = await result.toArray();
    res.setHeader('Content-Type', 'application/json');
    res.status(200).json(lists);
  } catch (err) {
    res.status(500).json({ message: err });
  }
};

3. Проблемы с подключением к базе данных

Вы проверяете соединение с базой данных, и оно устанавливается, однако необходимо убедиться, что вы корректно обращаетесь к коллекции и выполнили запрос.

4. Неверная конфигурация MongoDB URI

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

5. Неправильная обработка ID автора

В функции getAuthorById присутствует условие обработки ошибок, которое не имеет действительного условия:

if (condition) {
  res.status(400).json({ message: err });
}

Это условие никогда не выполнится. Исправьте это:

if (err) {
  res.status(400).json({ message: err });
}

6. Проверка зависимостей

Проверьте, установлены ли все необходимые зависимости и совместимы ли версии. Вы используете актуальные версии пакетов, однако, иногда стоит попробовать переустановить зависимости, чтобы устранить возможные конфликты.

npm install

Заключение

После внесения предложенных изменений и исправлений ваш проект должен начать корректно обрабатывать запросы к маршруту /authors. Важно всегда проверять и обрабатывать ошибки, а также убедиться в правильности маршрутов. Если проблема всё ещё сохраняется, рассмотрите возможность использования инструментов для отладки, таких как console.log, для отслеживания выполнения кода и понимания точного момента возникновения сбоя. Удачи в разработке вашего API!

Оцените материал
Добавить комментарий

Капча загружается...