快速会话和请求模块

Express Session and Request Modules

在我的网站中,服务器端的所有内容都存储在 express-session 的会话中。 但是我不明白为什么,当我使用请求模块发出 HTTP 请求时,req.session 参数不在请求中。 我的意思是,请关注评论:

app.get('/prefix', async function(req, res) {
  console.log(req.session.login);
  // There ^ the req.session.login is true, and so it works

  if (req.session.login == false || req.session.login == null) return;
    var options = {
          url: 'https://bot-dreamsub.glitch.me/getPermission',
          json: true,
          jar: true,
          withCredentials: true
        }
  request(options, async function(err, res, json) {
    if (err) {
      throw err;
    }
    console.log(json);
    if (json == true) {
      res.sendFile(__dirname + '/prefix/prefix.html');
    } else {
      return;
    }
  });
});

app.get('/getPermission', function(req, res) {
  console.log(req.session.login);
  // There ^ the req.session.login is undefined, and so it sends null to the user

  try {
    if (req.session.login == false || req.session.login == undefined) {
      res.send(null);
    } else {
      // some other code
    }
  } catch(err) {
    console.log(err);
  };
});

我不知道为什么请求不在 HTTP 请求中发送会话,即使

withCredentials: true

我该怎么做才能完成它?

快速会话通过在发出原始请求的客户端浏览器中设置 cookie 来工作。具有相同 cookie 的未来请求将提供对同一会话的访问。当您从您的服务器自己 request() 时,您不会提供与原始 /prefix 请求相同的 cookie,因此您将无法访问同一会话。

既然你只是想用 request() 来调用你自己的服务器,我建议你只使用一个函数调用并将原来的 req.session 传递给那个函数调用,这样你会得到它。

然后您使用正常的代码分解来分解出您的 /getPermissions 路线和您想在 /prefix 路线中使用的代码之间的一些共同代码,以便它们可以使用和共享共同的功能您将当前 reqres 传递给。然后你不需要解决这个 cookie 问题,因为你已经有了正确的 req 对象,因此在这个分解的公共函数中有正确的 req.session

或者,您可以构建正确的 cookie 并将其与您的 request() 一起发送,这样它看起来就好像来自具有您想要的 cookie(以及会话)的原始浏览器,但那是当您已经拥有想要的 req.session 并且您可以将其传递到函数调用中而不是从头开始并尝试模拟一个 cookie 来让您进入正确的会话时,这是一种很长的做事方式。

I don't know why request doesn't send sessions within the HTTP request even with

首先,会话不会随请求一起发送。饼干是。然后您的服务器使用 cookie 找到正确的会话对象。

您对 request() 的调用在您使用的 cookie jar 中没有正确的 cookie,因此当该请求到达您的服务器时,它无法找到正确的会话对象。因此,当您的服务器收到请求时,它似乎来自另一个还没有会话的客户端,因此可能会为其创建一个新的 cookie 和一个新的会话。


仅供参考,如果看起来您可能在 request() 调用中混淆了 res 的两个定义。在这个 app.get('/prefix', async function(req, res) { 中有一个 res 定义为参数,然后在 request(options, async function(err, res, json) { 中有一个单独的 res 将覆盖该范围内的前一个。在我看来,当您执行 res.sendFile(__dirname + '/prefix/prefix.html'); 时,您可能使用了错误的 res。解决这个问题的最好方法可能是完全不使用 request() ,如上面所建议的(使用对您自己的服务器的函数调用)。但是,如果您仍然要使用 request(),那么您需要以不同的方式命名两个 res 参数,这样您仍然可以访问它们并且可以根据您的情况使用正确的参数。