首页 > 解决方案 > 如何使用 Mongoose 自动保存到 MongoDB 而不会出现延迟或冻结?

问题描述

我正在用 Node.js & express 编写一个文本编辑应用程序,并希望在用户编辑其文本时实现 Google Docs 式的自动保存。

目前,每当用户在文本区域中按下一个键时,我都会使用 AJAX 将其保存到数据库中。一旦我开始以任何不错的速度打字,保存过程就会冻结并且不会保存大部分内容。然而,这在缓慢打字时非常有效。我目前正在使用 mLab,MongoDB 托管,这可能是问题吗?

事实上,处理这项任务的最佳方法是什么?

edit.ejs(前端js):

$(document).ready(function() {

   $('#board-lyrics').keyup(updateLyrics);
   $('#board-title').keyup(updateLyrics);

   function updateLyrics() {
     let boardData = {
        title: $('#board-title').val(),
        content: $('#board-lyrics').val()
     }
     $.ajax({
         type: "POST",
         url: `./<%= id %>`,
         data: boardData,
         success: function(data) {

         },
         error: function() {
            console.log('error');
         }
      });
   }

});

应用程序.js

app.post('/edit/:id', urlencodedParser, (req, res) => {
   let user = req.user;
   let boardId = req.params.id;
   let query = {"_id": req.user.id};
   let update = {"$set": {}};
   let index;

   for (let i = 0; i < user.boards.length; i++) {
    if (user.boards[i]._id == boardId) {
         index = i;
    }
   }

   update.$set[`boards.${index}.title`] = req.body.title;
   update.$set[`boards.${index}.content`] = req.body.content;

   let options = { new: true };
   User.findOneAndUpdate(query, update, options, function(err, doc){
      console.log(query);
      console.log(update);
      console.log(doc);
   });
});

标签: node.jsmongodbexpressmongoose

解决方案


好的,这里有两件事。首先,在每次击键时更新数据库并不是一个好主意。想想看。您在一秒钟内多次向您的服务器发出发布请求,其中包含有效负载和触摸数据库。不理想。因此,要么将此数据缓存并在超过阈值时保存(例如在一段或 X 个字符之后),要么,

其次,您也可以在此处对前端进行一些调整。确保您只捕获有效或想要的击键。使用反应式编程。检查 Rxjs 并过滤掉无效字符或仅在特定时间间隔捕获。希望这会有所帮助。


推荐阅读