Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 获取对RESTAPI服务器的请求_Node.js_Mongodb_Rest_Express_Mongoose - Fatal编程技术网

Node.js 获取对RESTAPI服务器的请求

Node.js 获取对RESTAPI服务器的请求,node.js,mongodb,rest,express,mongoose,Node.js,Mongodb,Rest,Express,Mongoose,这是我第一次使用Node.js、Express和MongoDB构建RESTAPI。DB(命名API)有两个集合(文章和源代码),其中包含超过10万个文档。每次我发送此GET请求时http://localhost:3000/Articles/results?limit=10对于文章集合,邮递员挂起,然后服务器崩溃。值得注意的是,若我发送一个get请求,并且只包含\u id,它将返回文档。下面是我的代码 require('dotenv').config() const express = requ

这是我第一次使用Node.js、Express和MongoDB构建RESTAPI。DB(命名API)有两个集合(文章和源代码),其中包含超过10万个文档。每次我发送此GET请求时
http://localhost:3000/Articles/results?limit=10
对于文章集合,邮递员挂起,然后服务器崩溃。值得注意的是,若我发送一个get请求,并且只包含
\u 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
模型

服务器崩溃时发生的错误很长,下面是其中的一个片段

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]

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

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

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

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

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

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

,如果传入了不合理的值,服务器应绝对确保将限制净化为合理的值。@jfriend00绝对正确。我添加了这一点,就像您添加您的评论一样,我相信:)我做了更改,发送了这个GET请求
http://localhost:3000/Articles?limit=10
并获得此响应
“消息”:“未能分析:{find:\'Articles\'、筛选器:{}、投影:{}、限制:\'10\'、返回键:false、showRecordId:false、lsid:{id:UUID(\”22d332f8-788a-4737-9712-cb8515241f1d\”},$db:“API\”}。“限制”字段必须是数字。”
My bad。需要将限制解析为一个数字。检查更新后的值。并且,服务器应绝对确保在传入非合理值的情况下将限制净化为合理值。@jfriend00绝对正确。我添加了这一点,就像您添加您的评论一样,我相信:)我做了更改,发送了这个GET请求
http://localhost:3000/Articles?limit=10
并获得此响应
“消息”:“未能分析:{find:\'Articles\'、筛选器:{}、投影:{}、限制:\'10\'、返回键:false、showRecordId:false、lsid:{id:UUID(\”22d332f8-788a-4737-9712-cb8515241f1d\”},$db:“API\”}。“限制”字段必须是数字。”
My bad。需要将限制解析为一个数字。检查更新的一个。