【问题标题】:GET request to REST API crashes server对 REST API 的 GET 请求使服务器崩溃
【发布时间】:2020-03-12 05:08:12
【问题描述】:

这是我第一次使用 Node.js、Express 和 MongoDB 构建 REST API。 DB(命名为 API)有两个集合(Articles 和 Sources),Articles 集合中有超过 100k 的文档。每次我将此 GET 请求 http://localhost:3000/Articles/results?limit=10 发送到 Articles 集合时,邮递员都会挂起然后服务器崩溃。值得一提的是,如果我仅使用 _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);

服务器崩溃时出现的错误很长,下面是它的sn-p

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]

【问题讨论】:

    标签: node.js mongodb rest express mongoose


    【解决方案1】:

    您的查询参数limit 似乎没有用于限制您的查找,因此您正在尝试查找所有 100K 文章,这导致您的堆溢出。在 8 号线的路线中,尝试:

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

    未来的一个想法可能是在直接使用 req.query.limit 调用 mongoose 之前验证它,这样您就不会因为传入非常高的值或只是忘记添加限制而意外崩溃节点应用程序获取请求中的查询参数。

    【讨论】:

    • 而且,服务器应该绝对确保限制被清理到一个合理的值,以防传入不合理的值。
    • @jfriend00 完全正确。我添加了那一点,就像你添加你的评论一样,我相信:)
    • 我进行了更改,发送了这个 GET 请求 http://localhost:3000/Articles?limit=10 并得到了这个响应 "message": "Failed to parse: { find: \"Articles\", filter: {}, projection: {}, limit: \"10\", returnKey: false, showRecordId: false, lsid: { id: UUID(\"22d332f8-788a-4737-9712-cb8515241f1d\") }, $db: \"API\" }. 'limit' field must be numeric."
    • 我的错。限制需要解析为一个数字。检查更新的。
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多