Вопрос или проблема
Я создавал небольшой 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!