Как автоматически сохранить в MongoDB с Mongoose без задержки или зависания? - PullRequest
0 голосов
/ 01 апреля 2019

Я пишу приложение для редактирования текста с Node.js & express и хочу добиться автоматического сохранения Google Docs-esque всякий раз, когда пользователь редактирует свой текст.

В настоящее время я делаю это, сохраняя в базу данных с 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 Ответ

0 голосов
/ 01 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...