#node.js #mongodb #express
Вопрос:
Я очень новичок в MongoDB и в настоящее время следую учебнику по блогу, в котором рассказывается, как создать веб-сайт с использованием стека MERN.
Проблема
Проблема заключается в бэкэнде, особенно в извлечении документов из бэкэнда. Я сам вставил документ в базу данных (через веб-сайт) для тестирования. Он находится в сборнике под названием «Статьи».:
_id:613c75edd38cd146c0b8a1df
title:"An experimental evaluation of test driven development vs. test-last de..."
authors:"Munir, H., Wnuk, K., Petersen, K., Moayyed, M."
source:"EASE"
pubyear:"2014"
doi:"https://doi.org/10.1145/2601248.2601267"
claim:"code quality improvement"
evidence: "strong support"
Мои Файлы
Ниже приведена модель базы данных статьи:
const mongoose = require('mongoose')
const ArticleSchema = new mongoose.Schema({
id: {
type: Number
},
title: {
type: String,
required: true
},
authors: {
type: String,
required: true
},
source: {
type: String,
required: true
},
pubyear: {
type: String,
required: true
},
doi: {
type: String,
required: true
},
claim: {
type: String,
required: true
},
evidence: {
type: String,
required: true
}
});
module.exports = Articles = mongoose.model('Articles', ArticleSchema);
Вот маршруты:
// routes/api/articles.js
const express = require('express');
const router = express.Router();
// Load Articles model
const Articles = require('../../models/Articles');
console.log(Articles);
// @route GET api/articles/test
// @description tests articles route
// @access Public
router.get('/test', (req, res) => res.send('articles route testing!'));
// @route GET api/articles
// @description Get all articles
// @access Public
router.get('/', (req, res) => {
Articles.find()
.then(articles => res.json(articles))
.catch(err => res.status(404).json({ noarticlesfound: 'No articles found' }));
});
// @route GET api/articles/:id
// @description Get single articles by id
// @access Public
router.get('/:id', (req, res) => {
Articles.findById(req.params.id)
.then(article => res.json(article))
.catch(err => res.status(404).json({ noarticlefound: 'No article found' }));
});
// @route GET api/articles
// @description add/save articles
// @access Public
router.post('/', (req, res) => {
Articles.create(req.body)
.then(article => res.json({ msg: 'Article added successfully' }))
.catch(err => res.status(400).json({ error: 'Unable to add this article' }));
});
// @route GET api/article/:id
// @description Update article
// @access Public
router.put('/:id', (req, res) => {
Articles.findByIdAndUpdate(req.params.id, req.body)
.then(article => res.json({ msg: 'Updated successfully' }))
.catch(err =>
res.status(400).json({ error: 'Unable to update the Database' })
);
});
// @route GET api/article/:id
// @description Delete article by id
// @access Public
router.delete('/:id', (req, res) => {
Articles.findByIdAndRemove(req.params.id, req.body)
.then(article => res.json({ mgs: 'Article entry deleted successfully' }))
.catch(err => res.status(404).json({ error: 'No such a article' }));
});
module.exports = router;
Бэкэнд работает отлично. Когда я перехожу на тестовый маршрут, он возвращает ожидаемую строку. Но, похоже, он всегда возвращает пустую коллекцию ( []
) при извлечении чего-либо.
Мой app.js файл:
// app.js
const express = require('express');
const connectDB = require('./config/db');
var cors = require('cors');
// routes
const articles = require('./routes/api/articles');
const app = express();
// Connect Database
connectDB();
// cors
app.use(cors({ origin: true, credentials: true }));
// Init Middleware
app.use(express.json({ extended: false }));
app.get('/', (req, res) => res.send('Hello world!'));
// use Routes
app.use('/api/articles', articles);
const port = process.env.PORT || 8085;
app.listen(port, () => console.log(`Server running on port ${port}`));
Что я пробовал
Большинство проблем, которые я вижу в переполнении стека, похоже, связаны с чем-то вроде db.collection.однако в этом руководстве ничего не говорится о получении подобных данных, поэтому я не смог попробовать большинство исправлений.
Я заметил, что в коллекции статей идентификатор на самом деле _id, поэтому я внес это изменение в модель базы данных для статей, и ничего не изменилось.
Ответ №1:
Это формат, которому я обычно следую, но не могли бы вы включить эту модификацию и проверить, работает ли она?
Я попробовал это с другой базой данных, и это работает для меня.
router.get("/", function (req, res) {
Articles.find({}, function (err, allDetails) {
if (err) {
console.log(err);
} else {
res.json(allDetails);
}
});
});
Комментарии:
1. Я попробовал и, к сожалению, получил тот же результат
2. Я обновил код. Пожалуйста, проверьте это.
3. Кстати, я ценю всю вашу помощь! Но та же проблема, он по-прежнему возвращает пустой результат. В этот момент я совершенно растерян.
4. Мне удалось во всем этом разобраться. Сначала я протестировал свой сервер с помощью онлайн-тестера api, и он продолжал возвращать ошибку 400. С тех пор я сделал довольно много, так что я действительно не помню, в чем была проблема. Я понял, что причина, по которой я не мог отправлять статьи, заключалась в том, что я не вводил все переменные, которые были в модели базы данных статей. Примерно в то же время я понял другую ошибку.