Как выполнить автоматическое сохранение в MongoDB с помощью Mongoose без задержек или зависания?

#node.js #mongodb #express #mongoose

#node.js #mongodb #экспресс #mongoose

Вопрос:

Я пишу приложение для редактирования текста с Node.js amp; 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');
         }
      });
   }

});
  

app.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);
   });
});
  

Комментарии:

1. вам не следует обновлять свою базу данных слишком часто, вместо этого я бы посоветовал сохранить фрагмент из 50 символов, а затем сохранить эти фрагменты.

2. Хорошо, спасибо. Я также мог бы сохранить его, если ограничение на количество символов в блоке не будет достигнуто в течение ~ 4 секунд.

Ответ №1:

Хорошо, здесь две вещи. во-первых, не стоит обновлять вашу базу данных при каждом нажатии клавиши. Подумайте об этом. Вы отправляете post-запрос на свой сервер более одного раза в секунду с полезной нагрузкой и касаетесь базы данных. Не идеально. Итак, либо вы сохраняете эти данные в кэше и сохраняете их, как только они пересекают пороговое значение (скажем, после одного абзаца или X количества символов), либо,

во-вторых, вы также можете внести некоторые изменения во внешний интерфейс здесь. Убедитесь, что вы фиксируете только допустимые или нужные нажатия клавиш. Используйте реактивное программирование. Проверьте наличие Rxjs и отфильтруйте недопустимые символы или перехватывайте только с определенным интервалом. Надеюсь, это поможет.