好的,对于我的高级设计项目,我正在与一个关于SGA学生志愿者计划的Node.JS / Express应用程序的小组合作 . 我们使用MongoDB与Express中的会话存储一起进行持久化 .
-
当用户登录时,他们的文档将被复制到他们的会话存储中 .
-
随时修改用户数据,将其写入MongoDB数据库 . 如果数据库更新成功,则使用更新产生的数据库中的新文档更新用户会话 .
-
无论何时请求用户数据,都会从会话存储中读取 .
只要每次在数据库中成功修改用户数据时会话保持更新,这都可以正常工作 . 它还允许我们避免每次使用某些用户数据渲染视图时都必须从数据库中读取数据 .
我们有不同类型的用户 . 我们有学生 volunteer
类型的用户,不同级别的 staff
类型用户 . 在我的合作伙伴为顶级 staff
类型用户实现功能之前,我认为会话/数据库组合不会出现问题 . 他们可以修改学生 volunteer
用户的数据 .
在写入数据库时,这不是问题,我们只需将修改后的数据写入志愿者文档 . 问题来自于,据我所知,我们无法更新/无效/删除 volunteer
用户的会话以响应来自 staff
类型用户的请求进行修改 .
基本上,如果 staff
用户修改了 volunteer
用户的数据且 volunteer
用户未签名,那么一切正常,将进行修改并修改数据库中的 volunteer
文档 . 当志愿者登录时,将从数据库中读取此修改后的数据并存储在用户的会话中 .
但是,如果 staff
用户修改了 volunteer
用户的数据并且 volunteer
用户已登录,那么可能会出现问题 . 数据库中的 volunteer
文档将被更新,但 volunteer
用户的会话将不会更新,直到会话结束并且用户再次登录,导致他们的文档从数据库读入新会话,或直到 volunteer
用户修改他们的数据,导致他们的会话使用来自数据库的新数据进行更新(这种可能性可能会也可能不会覆盖 staff
用户所做的更改) .
毋庸置疑,如果不加以解决,这有可能导致不一致 . 有没有人对我如何处理这个有任何建议 . 如果我们要允许一个用户更新另一个用户的数据,是否无法按计划使用会话存储?
是否可以使特定用户的会话无效/删除以响应不同的特定用户的请求?或者可以修改特定用户的会话以响应不同的特定用户的请求?
EDIT: 不确定这是如何偏离主题,也许有点过于集中,可能没有'minimal understanding',我会尝试通过添加更多来澄清我的问题来纠正这个问题:
function updateUserDocument(req, res, id, callback) {
var data = req.body;
var query = { _id: id };
var cmd = {
$set: {
role: 'volunteer',
volunteer: data
}
};
var opt = { w: 1, new: true };
users.findAndModify(query, null, cmd, opt, function (err, updated) {
if (err || !updated) {
callback(err);
} else {
callback(null, updated);
}
});
}
这是在 volunteer
更新自己的数据时以及 staff
用户更新 volunteer
用户数据时使用的,不同之处在于当志愿者更新其数据时,在回调中传回的更新文档用于更新会话(我使用下划线合并方法)
例:
module.exports = {
volunteerUpdateVolunteer: function (req, res) {
updateUserData(req, res, req.session.user._id, function (err, doc) {
if (err) {
res.send(400);
} else {
// save user session with updated document send success response
_.merge(req.session.user, doc);
res.send(200);
}
});
},
staffUpdateVolunteer: function (req, res) {
updateUserData(req, res, req.params.id, function (err, doc) {
if (err) {
res.send(400);
} else {
// no way to update the volunteer user's session here?
// how can I handle possible inconsistencies?
res.send(200);
}
});
},
由于我们的项目设计到目前为止,这是我的问题 . 我不认为 Session 可以通过这种方式保持更新,但我不确定 . 有没有办法让会话更新?或者我们只是错误使用它?
1 回答
在查看了code之后,我写了下面的片段,希望它可能会有所帮助