node.js - 快速会话 req.session 不持久
问题描述
我目前正在使用带有 connect-session-knex 作为存储的快速会话,我的问题是会话在 API 调用之间不会持续存在。任何设置为 req.session 的变量在以后的请求中都无法访问,而且每次的 sessionID 也是不同的。
例如,在下面的代码中,调用 login 将正确设置 req.session.user(我可以看到这反映在数据库和 console.log 中)但是当之后调用 checkAuth 时,req.session.user 将是未定义的因为新的会话已经开始。
我已阅读有关此主题的其他答案并尝试了每个建议的修复(手动调用 req.session.save、检查 cors 配置、重新排序中间件调用、在 express-session 配置中设置“secure: false”、设置“credentials:包括”在客户端),但它们似乎都不起作用。非常感谢任何建议!
1. 配置
app.use(cors({
origin: 'http://localhost:3000',
credentials: true
}))
app.use(session({
secret: process.env.SESSION_SECRET,
saveUninitialized: false,
resave: false,
cookie: {
httpOnly: false,
maxAge: 14400000,
sameSite: true,
secure: false
}
}))
app.use('/session', routes.session);
app.use('/user', routes.user);
app.use('/schedule', routes.schedule);
app.use('/message', routes.message);
2.API方法
//example values for simplicity
let correctEmail = "bob@gmail.com"
let correctPassword = "password"
let userId = 31
router.post('/login', (req, res) => {
const {email, password} = req.body
if (email === correctEmail && password === correctPassword) {
req.session.user = userId
req.session.save()
console.log(req.session.user) //31
return res.sendStatus(200)
} else {
return res.status(400).send({error: "Those account details don't match our records"})
}
});
router.post('/checkAuth', (req, res) => {
console.log(req.session.user) //undefined
if (req.session.user) {
return res.sendStatus(200)
} else {
return res.status(400).send({error: "Not authenticated"})
}
});
3.客户端调用
const login = async () => {
const requestHeaders = {
Accept: 'application/json',
'Content-Type': 'application/json',
'Access-Control-Request-Method': 'POST',
}
fetch(serverAddress + "/session/onboard/provider", {
method: 'POST',
credentials: 'include',
mode: 'cors',
headers: requestHeaders,
body: JSON.stringify(person)
});
}
const checkAuth = async () => {
const requestHeaders = {
Accept: 'application/json',
'Content-Type': 'application/json',
'Access-Control-Request-Method': 'POST',
}
fetch(serverAddress + "/session/checkAuth", {
method: 'POST',
credentials: 'include',
mode: 'cors',
headers: requestHeaders,
body: JSON.stringify(data),
});
}
解决方案
推荐阅读
- excel - 使用 VBA 匹配数据列中的子字符串
- javascript - Webdriverio:访问 shadow dom 元素
- sql - 表上的自联接如何返回比表中实际数据更多的行?
- macos - SwiftUI (2.) for MacOS 中的 Buggy 菜单控件
- neo4j - 更新全文搜索索引
- javascript - 当类放在工厂函数之外时,为什么我无法访问 uid 和其他属性?
- ffmpeg - 使用ffmpeg从mp4中提取字幕
- php - XAMPP 自动将值添加到输入字段或类似的东西
- jquery - FireFoxDriver 找不到使用 Jquery 选择器的元素
- scala - 如何将Scala中的每个n元素组合在一起?