好的,所以对于我的高级设计项目,我正在与一个团队合作开发 Node.JS / Express 应用程序,用于 SGA 学生志愿者计划。我们使用 MongoDB 和 Express 中的会话存储来实现持久性。
当用户登录时,他们的文档被复制到他们的会话存储中。
任何时候修改用户数据,都会将其写入 MongoDB 数据库。如果数据库更新成功,则用户会话将使用数据库中由更新产生的新文档进行更新。
任何时候请求用户数据,都会从会话存储中读取。
只要每次在数据库中成功修改用户数据时会话保持更新,这就会起作用。它还让我们避免每次使用一些用户数据渲染视图时都必须从数据库中读取数据。
我们有不同类型的用户。我们有学生volunteer
类型的用户,不同级别的staff
类型用户。在我的合作伙伴为顶级staff
类型用户实现功能之前,我认为会话/数据库组合不会出现问题。他们有能力修改学生volunteer
用户的数据。
这在写入数据库时不是问题,我们只是将修改后的数据写入志愿者文档。问题来自这样一个事实,据我所知,我们无法更新/无效/删除volunteer
用户的会话以响应staff
类型用户的修改请求。
基本上,如果staff
用户修改了volunteer
用户的数据并且volunteer
用户未签名,那么一切正常,将进行修改并volunteer
修改数据库中的文档。当志愿者登录时,这个修改后的数据将从数据库中读取并存储在用户的会话中。
但是,如果staff
用户修改了volunteer
用户的数据并且volunteer
用户已登录,则可能会出现问题。数据库中的volunteer
文档将被更新,但volunteer
用户的会话将不会更新,直到会话结束并且用户再次登录导致他们的文档从数据库被读取到他们的新会话中,或者直到volunteer
用户修改他们的数据导致他们的会话使用数据库中的新数据进行更新(这种可能性可能会也可能不会覆盖staff
用户所做的更改)。
不用说,如果不加以解决,这有可能导致不一致。有没有人对我如何处理这个问题有任何建议。如果我们要允许一个用户更新另一个用户的数据,是否不能按计划使用会话存储?
是否可以响应不同的特定用户的请求而使特定用户的会话无效/删除?或者可以修改特定用户的会话以响应不同的特定用户的请求?
编辑: 不知道这是如何偏离主题的,也许有点过于专注并且可能没有“最少的理解”,我将尝试通过添加更多内容来澄清我的问题来纠正这一点:
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);
}
});
},
由于我们的项目是到目前为止设计的,这是我的问题。我不认为会话可以以这种方式保持更新,但我不确定。有没有办法让会话保持更新?还是我们只是用错了?