极高的加载时间 - 请求未异步运行。猫鼬

Posted

技术标签:

【中文标题】极高的加载时间 - 请求未异步运行。猫鼬【英文标题】:Extremely high loading times - Requests not running async. Mongoose 【发布时间】: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 请求并行发生,尽管请求非常大,但它们不应该花这么长时间

网络标签的屏幕截图:

(忽略失败的请求,以及一些重复的命名请求)

*** sempais 请帮忙。这是一个非常大的应用程序,我不知道到底是什么问题,所以如果我错过了任何细节 - 抱歉,我会澄清任何需要澄清的地方。

【问题讨论】:

/chat 的响应为 17MB。为什么您可能要加载 17MB 的数据以显示在网页中? 那是你真正的问题,与查看 MongoDB 内部或其他类似的东西无关。所以不清楚你在这 30 个结果中实际存储了什么,但是 17MB 对于网页来说太大了,所以你需要“修剪”你存储在那里的脂肪,因为没有必要这样做。 谢谢,我现在找到了导致如此大量数据加载的原因。感谢您指出这一点。 【参考方案1】:

来自先前废弃且实施不佳的图像上传功能的大量 base64 编码数据存储在每个聊天消息以及其他地方,导致加载大量数据并最终导致加载时间过长。

谢谢Neil Lunn。

【讨论】:

以上是关于极高的加载时间 - 请求未异步运行。猫鼬的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 同时运行多个异步请求

ajax的同步与异步

Three.js fbx 未正确加载

猫鼬模型密钥未插入 Postman 发布请求中

猫鼬模型密钥未插入 Postman 发布请求中

使用异步操作运行同步代码