express-session:在其他路由中无法访问会话

问题描述 投票:0回答:1

我正在使用express-session在会话中存储身份验证令牌。我面临的问题是在/authenticate(获取路由)中未定义在/join(发布路由)中设置的会话。我已经搜索了类似的问题,但这没有帮助。知道我的代码出了什么问题吗?

server.js

// All required modules loaded..

// Session config
app.use(
  session({
    secret: "mysessionsecret",
    resave: false,
    saveUninitialized: false,
    cookie: { secure: false, maxAge: 6000000 }
  })
);

// @route:authenticate
app.post("/authenticate", async (req, res) => {
  const { username, password } = req.body;

  try {
    const user = await User.findOne({ username });

    if (!user) {
      return res.status(400).json({ msg: "Invalid username entered" });
    }

    // Compare the password
    const compare = await bcrypt.compare(password, user.password);

    if (!compare) {
      return res.status(400).json({ msg: "Incorrect password" });
    }

    // Create token of the user ID
    jwt.sign(
      {
        userId: user.id
      },
      config.get("jwtSecret"),
      {
        expiresIn: "2d"
      },
      (err, token) => {
        if (err) throw err;

        if (!req.session.user_id) {
           req.session.token = token;

           console.log(req.session.token); // Accessable here
        }
      }
    );

    res.end();
  } catch (error) {
    return res.send("Server error");
  }
});



   // @route:get /join
   app.get("/join", (req, res) => {
    console.log(req.session.token); // token not accessable here. returns undefined

     return res.end();
   });
express session express-session
1个回答
0
投票

令牌将不在cookie中,仅在服务器上。 Cookie只是一个会话ID。快速会话cookie的默认名称为connect.sid。应该有一个带有该名称的cookie。

[如果您在任何地方都看不到该Cookie,请尝试saveUninitialized:true。在req.session.save()路由中修改会话后,您也可以尝试呼叫/authenticate。其中任何一种都应引起会话cookie的设置。

[设置saveUnitialized: false时,您告诉express-session不要设置会话cookie,直到您告诉它为止。不幸的是,该文档并没有真正说明您如何告诉它现在设置会话cookie。我的猜测是req.session.save()可能会做到,或者只是将saveUnitialized变为true也能做到。您可以仅使用这两项更改中的一项进行试验,尽管现在您拥有会话cookie,因此您必须清除它以便仅使用其中一项进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.