首页 > 解决方案 > 快速会话 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),
        });
    }

标签: node.jsexpresssessionexpress-session

解决方案


推荐阅读