【发布时间】:2019-09-13 05:17:24
【问题描述】:
概述
我已经使用 Vue、Express 和 MongoDB (mongoose ORM) 构建了一个应用程序。 在加载登录页面时,会针对各种数据位发出一系列 GET 请求。加载时间非常长,我记录了某些特定路线的加载时间高达 22 秒。这让我相信我的请求是按顺序运行的,尽管在我的逻辑中指定一切都应该异步运行
我已经尝试减小从请求返回的对象的大小以及使用.lean() 方法。这些尝试缩短了几秒钟,但总体问题并未远程排序。时代仍然很愚蠢。举个例子:
从这里:
// Method to find all users
var users = await User.find({});
收件人:
// Method to find all users
var users = await User.find({}, "username, uid").lean();
在相关页面上,大约有 5 个主要组件。每个组件都在发出一个 get 请求。其中之一是聊天栏,其代码如下:
ChatCol.vue
beforeMount () {
this.$store.dispatch('retrieve_chat')
}
Store.js(我正在使用 Vuex 商店)
retrieve_chat (context) {
return new Promise((resolve, reject) => {
axios({
url: api.dev + 'api/v1/chat',
method: 'GET',
})
.then(res => {
context.commit('set_chat', res.data)
resolve(res);
}).catch(err => {
// alert(err)
reject(err);
})
})
},
正在对所有组件发出这种格式的请求。相关页面中大约有 5 个。
后端/服务器代码
为正在发出的请求提供一些上下文。 客户端将点击路由'http://localhost:3000/api/v1/chat'
在服务器上发出请求的代码如下:
var Chat = require("../models/ChatMessage");
module.exports = {
// LIMIT CHAT TO 100 MESSAGES
async get_chat(req, res) {
Chat.find({}, function(err, messages) {
if (err) {
return res.status(500).send({
message: "Interval Server Error",
type: "MONGO_CHAT_DOCUMENT_QUERY",
err: err,
})
}
if (!messages) {
return res.status(400).send({
message: "Resource not found",
type: "MONGO_CHAT_DOCUMENT_QUERY",
details: "!messages - no messages found",
})
}
messages.reverse();
return res.status(200).json({
messages,
});
}).sort({"_id": -1}).limit(30);
},
}
如果我查看 chrome 开发工具上的网络选项卡,这就是请求的显示方式。为冗长的帖子道歉,我真的不知道是什么原因造成的
重要提示:
有人向我提到 mongodb 有这个功能,它在改变数据时会锁定,我认为可能是这种情况,但没有发生任何改变。这只是 3/4 的 get 请求并行发生,尽管请求非常大,但它们不应该花这么长时间
网络标签的屏幕截图:
(忽略失败的请求,以及一些重复的命名请求)
StackOverflow sempais 请帮忙。这是一个非常大的应用程序,我不知道到底是什么问题,所以如果我错过了任何细节 - 抱歉,我会澄清任何需要澄清的地方。
【问题讨论】:
-
/chat的响应为 17MB。为什么您可能要加载 17MB 的数据以显示在网页中? 那是你真正的问题,与查看 MongoDB 内部或其他类似的东西无关。所以不清楚你在这 30 个结果中实际存储了什么,但是 17MB 对于网页来说太大了,所以你需要“修剪”你存储在那里的脂肪,因为没有必要这样做。 -
谢谢,我现在找到了导致如此大量数据加载的原因。感谢您指出这一点。
标签: mongodb express asynchronous mongoose