目前,我使用会话的默认存储(即尚未将会话数据保存到DB)。我有一个POST路由,它使用一个中间件来检查DB中的用户,如果用户存在,它将用户对象保存到会话中,这是正常工作的,然后在同一个中间件中再往下一点,我根据一个条件添加到同一个会话中,这个第二次写入会话没有发生,甚至在路由完成时也没有发生。
app.post('/', searchDb(db), (req, res) => {
res.redirect(`/someplace`);
});
在一个中间件文件夹…
searchDB = (db) => {
return async (req, res, next) => {
{ email } = req.body;
const user = await db.findOne({ emailAddress: `${email}` })
if (user) {
req.session.validUser = user;
if (condition) {
req.session.validUser.storeMoreStuff = "something"
} else {
req.session.validUser.storeMoreStuff = "somethingelse"
}
return next();
}
}
}
module.exports = { searchDB };
我不明白什么?
更新#1:1/14/22:虽然它感觉有点黑客,我尝试修改用户对象之前保存到会话。
searchDB = (db) => {
return async (req, res, next) => {
{ email } = req.body;
let user = await db.findOne({ emailAddress: `${email}` })
if (user) {
user.storeMoreStuff = "something"
req.session.validUser = user;
return next();
}
}
}
module.exports = { searchDB };
但是,只有从DB中取出的user对象的原始版本被写入会话。
更新#2:1/14/22:在保存到会话之前,还试图修改用户对象的副本。
searchDB = (db) => {
return async (req, res, next) => {
{ email } = req.body;
let user = await db.findOne({ emailAddress: `${email}` })
let test = user;
test.storeMoreStuff = "something"
req.session.validUser = test;
}
}
module.exports = { searchDB };
相同的结果。我现在想知道来自DB查找操作的"user"是否是一个对象(尽管它看起来像一个对象)。也许这就是为什么看似正常的对象操作没有按预期工作的原因。添加一个"mongodb"标签,以防这是蒙古人的特质/误解。
我不愿意称之为答案,因为我不明白为什么在进行额外的键值对分配之前,通过将用户对象的每个键值对复制到临时对象中,我能够更新对象,然后将其写入会话:
searchDB = (db) => {
return async (req, res, next) => {
{ email } = req.body;
const user = await db.findOne({ emailAddress: `${email}` })
if (user) {
const copyUser = {
key1: user.value1,
key2: user.value2,
key3: user.value3
}
req.session.validUser = copyUser;
if (condition) {
req.session.validUser.storeMoreStuff = "something"
} else {
req.session.validUser.storeMoreStuff = "somethingelse"
}
return next();
}
}
}
module.exports = { searchDB };