#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 и отфильтруйте недопустимые символы или перехватывайте только с определенным интервалом. Надеюсь, это поможет.