さて、私の上級設計プロジェクトでは、SGA 学生ボランティア プログラムの Node.JS / Express アプリケーションのグループと協力しています。Express のセッション ストアと共に永続化のために MongoDB を使用しています。
ユーザーがサインインすると、ドキュメントがセッション ストレージにコピーされます。
ユーザー データが変更されるたびに、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);
}
});
},
私たちのプロジェクトはこれまでのところ設計されているので、これは私の問題です。この方法でセッションを更新し続けることができるとは思いませんが、よくわかりません。セッションを最新の状態に保つ方法はありますか? それとも使い方が間違っているのでしょうか?