MongoDB .find() возвращает значение null при наличии документов

#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. С тех пор я сделал довольно много, так что я действительно не помню, в чем была проблема. Я понял, что причина, по которой я не мог отправлять статьи, заключалась в том, что я не вводил все переменные, которые были в модели базы данных статей. Примерно в то же время я понял другую ошибку.