node.js - 如何使用 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);
});
});
解决方案
好的,这里有两件事。首先,在每次击键时更新数据库并不是一个好主意。想想看。您在一秒钟内多次向您的服务器发出发布请求,其中包含有效负载和触摸数据库。不理想。因此,要么将此数据缓存并在超过阈值时保存(例如在一段或 X 个字符之后),要么,
其次,您也可以在此处对前端进行一些调整。确保您只捕获有效或想要的击键。使用反应式编程。检查 Rxjs 并过滤掉无效字符或仅在特定时间间隔捕获。希望这会有所帮助。
推荐阅读
- mysql - 为不存在的数据返回空行
- sql - 如何使用正则表达式替换 SQLite 中的部分字符串?
- vulkan - Vulkan:为什么我们需要在 VkQueuePresentKHR 之后检查窗口调整大小
- javascript - 如果 Xpage 已提交,我可以从 CSJS 中查看吗?
- javascript - 使用 Ajax 在完整日历上显示数据而不显示记录
- c++ - 我如何获取引脚 4 的值以发送到从机并使用 I2C 显示?
- javascript - 是否可以使用 flatbuffers 将序列化数据流式传输到文件中?
- r - 我想模拟具有不同样本大小 n、不同 SD 值和不同 theta 值的一阶 MA(1) 的移动平均过程
- excel - 当两列重复时,如何在 Excel 中使用条件格式突出显示?
- javascript - 将 onPress 重定向传递给子组件 React Native