Node.js 获取对RESTAPI服务器的请求
这是我第一次使用Node.js、Express和MongoDB构建RESTAPI。DB(命名API)有两个集合(文章和源代码),其中包含超过10万个文档。每次我发送此GET请求时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
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。需要将限制解析为一个数字。检查更新的一个。