我可以强制会话从服务器端更新吗?
Can I force a session to update from the server side?
我有通过 passport 创建的用户配置文件,这些配置文件通过 connect-mongo 存储在 mongodb 中。如果我更新会话的用户配置文件,我必须 运行 req.login()
触发护照更新用户会话以匹配新的数据库信息。如果我从我的管理员帐户更改另一个用户,我无法 运行 此功能,有没有办法可以为用户更新它,或者在下次加载他们的会话时触发它进行更新?
您可以将整个用户对象传递给会话存储,这将确保您的用户对象始终与最新信息保持同步。
passport.serializeUser(function(user, cb) { cb(null, user); });
passport.deserializeUser(function(user, cb) { cb(null, user); });
最后我不得不手动完成这一切:
- 搜索具有匹配用户 ID 的会话
- 加载最新的用户信息并在会话中替换
- 将新信息保存回数据库
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
const SessionSchema = new Schema({_id: String}, { strict: false });
const Session = mongoose.model('sessions', SessionSchema, 'sessions');
var User = require('../queries/single.js');
module.exports = function (userId, callback) {
console.log('finding session for',userId);
Session.findOne({session: {$regex: userId}},null,{lean: true},(err, session)=>{
if (err) return callback(err);
if (!session) return callback('user session not found');
//parse session
var sessionJson = JSON.parse(session.session);
//add reset flag
sessionJson.passport.user.resetSession = true;
//get updated user info
User({_id: sessionJson.passport.user._id}, (err, updatedUser)=>{
if (err) return callback(err);
//add new user info to session json
sessionJson.passport.user = updatedUser;
//save back to session
Session.findOneAndUpdate({_id: session._id},{$set: {session: JSON.stringify(sessionJson)}}, (err, savedSession) => {
if (err) return callback(err);
//success
return callback(null);
});
});
});
};
我有通过 passport 创建的用户配置文件,这些配置文件通过 connect-mongo 存储在 mongodb 中。如果我更新会话的用户配置文件,我必须 运行 req.login()
触发护照更新用户会话以匹配新的数据库信息。如果我从我的管理员帐户更改另一个用户,我无法 运行 此功能,有没有办法可以为用户更新它,或者在下次加载他们的会话时触发它进行更新?
您可以将整个用户对象传递给会话存储,这将确保您的用户对象始终与最新信息保持同步。
passport.serializeUser(function(user, cb) { cb(null, user); });
passport.deserializeUser(function(user, cb) { cb(null, user); });
最后我不得不手动完成这一切:
- 搜索具有匹配用户 ID 的会话
- 加载最新的用户信息并在会话中替换
- 将新信息保存回数据库
var mongoose = require('mongoose'); var Schema = mongoose.Schema;
const SessionSchema = new Schema({_id: String}, { strict: false });
const Session = mongoose.model('sessions', SessionSchema, 'sessions');
var User = require('../queries/single.js');
module.exports = function (userId, callback) {
console.log('finding session for',userId);
Session.findOne({session: {$regex: userId}},null,{lean: true},(err, session)=>{
if (err) return callback(err);
if (!session) return callback('user session not found');
//parse session
var sessionJson = JSON.parse(session.session);
//add reset flag
sessionJson.passport.user.resetSession = true;
//get updated user info
User({_id: sessionJson.passport.user._id}, (err, updatedUser)=>{
if (err) return callback(err);
//add new user info to session json
sessionJson.passport.user = updatedUser;
//save back to session
Session.findOneAndUpdate({_id: session._id},{$set: {session: JSON.stringify(sessionJson)}}, (err, savedSession) => {
if (err) return callback(err);
//success
return callback(null);
});
});
});
};