GET запрос к REST API сбой сервера - PullRequest
1 голос
/ 11 марта 2020

Я впервые создаю REST API с Node.js, Express и MongoDB. БД (называемая API) имеет две коллекции (Статьи и Источники) с более чем 100 тысячами документов в коллекции Статей. Каждый раз, когда я отправляю этот запрос GET http://localhost:3000/Articles/results?limit=10 в коллекцию «Статьи», почтальон зависает, а затем происходит сбой сервера. На заметку, если я отправлю запрос на получение только с _id, он вернет документ. Ниже приведен мой код

require('dotenv').config()

const express = require('express') 
const app = express()
const mongoose = require('mongoose')

mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true , useUnifiedTopology: true })
const db = mongoose.connection
db.on('error', (error) => console.error(error))
db.once('open', () => console.log('Connected to Database'))

app.use(express.json())

const articlesRouter = require('./routes/articles')
app.use('/articles', articlesRouter)

app.listen(3000, () => console.log('Server Started'))

Маршруты

const express = require('express')
const router = express.Router()
const Article = require('../models/articles')

//Getting All Articles
router.get('/', async (req, res) => {
  try {
      const articles = await Article.find()
      res.json(articles)
  } catch (err){
    res.status(400).json({message: err.message})
  }
})

//Getting One Article
router.get('/:id', getArticle, (req, res) => {
  res.json(res.article)

})

async function getArticle(req, res, next) {
  let article
  try{
    article = await Article.findById(req.params.id)
    if (article == null) {
      return res.status(404).json({ message: 'Cannot find article'})
    }
  } catch(err) {
    return res.status(500).json({ message: err.message })
  }

  res.article = article
  next() 
}

module.exports = router

Модель

const mongoose = require('mongoose')

var articlesSchema = new mongoose.Schema({
    author: String, content: String, description: String, publishedAt: Date, source_id: String, summarization: String, title: String, url: String, urlToImage: String}, { collection: 'Articles'});

module.exports = mongoose.model('Articles', articlesSchema);

Ошибка, возникающая при длительном сбое сервера, ниже приведен фрагмент

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10007e891 node::Abort() [/usr/local/Cellar/node/13.8.0/bin/node]
 2: 0x10007e9c0 node::OnFatalError(char const*, char const*) [/usr/local/Cellar/node/13.8.0/bin/node]
 3: 0x10017e6ab v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/local/Cellar/node/13.8.0/bin/node]

1 Ответ

3 голосов
/ 11 марта 2020

Кажется, что ваш параметр запроса limit не используется для ограничения вашего поиска, поэтому вы пытаетесь найти все ваши статьи по 100 КБ, что приводит к переполнению вашей кучи. На маршрутах в строке 8 попробуйте:

const articles = await Article.find({}, null, {limit: parseInt(req.query.limit, 10)})

Идея в будущем также может состоять в проверке req.query.limit перед его непосредственным использованием для вызова mon goose, чтобы вы случайно не взломали sh приложение узла, передавая очень высокие значения или просто забыв добавить ограничение в качестве параметра запроса в вашем запросе get.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...