好的,对于我的高级设计项目,我正在与一个关于SGA学生志愿者计划的Node.JS / Express应用程序的小组合作。我们使用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);
}
});
},
由于我们的项目设计到目前为止,这是我的问题。我不认为会议可以通过这种方式保持更新,但我不确定。有没有办法让会话更新?或者我们只是错误使用它?
答案 0 :(得分:1)
在查看code之后,我在下面写了一些片段,希望它可以提供帮助
var express = require('express');
var sesseionStore = new express.session.MemoryStore();
app.use(express.session({
secret: 'a4f8071f-c873-4447-8ee2',
cookie: { maxAge: 2628000000 },
store: sesseionStore
}));
var volunteerid2sessionid = {
};
express.use(function (req, res, next) {
volunteerid2sessionid[req.session.user._id] = req.sessionID;
next();
});
/// working with volunteer sesseion
// seems volunteerid is req.params.id in staffUpdateVolunteer
sessionid = volunteerid2sessionid[volunteerid];
sesseionStore.get(sessionid, function(err, sess){
});