Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 快速会话和请求模块_Node.js_Express_Request_Express Session - Fatal编程技术网

Node.js 快速会话和请求模块

Node.js 快速会话和请求模块,node.js,express,request,express-session,Node.js,Express,Request,Express Session,在我的网站中,服务器端的所有内容都存储在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 (r

在我的网站中,服务器端的所有内容都存储在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
路由中使用的内容之间分解出一些公共代码,以便它们都可以使用并共享一个公共函数,您可以将当前的
req
res
传递给它们。那么您就不需要解决这个cookie问题,因为您已经拥有了正确的
req
对象,因此在这个带系数的公共函数中就有了正确的
req.session

或者,您可以构建正确的cookie,并将其与您的
请求()一起发送,使其看起来像来自原始浏览器,该浏览器具有您想要的cookie(以及会话),但是,如果您已经拥有了所需的
req.session
,并且您可以在函数调用中传递它,而不是从头开始,并尝试模拟一个cookie,以使您进入正确的会话,那么这将是一个漫长的过程

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

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

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



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

哇,非常感谢!你的解决方案很简单,但我太笨了,我想不起它们。但是我的支持率没有显示出来,因为我的声誉不到15岁。@DanielVip3-Y你并不孤单。出于某种奇怪的原因,当人们使用快速路由时,他们完全忘记了将通用代码分解到共享函数中的能力,而不是从头调用路由。这种情况发生在很多人身上。不知道为什么?我想人们进入了路由设计模式,所有问题都应该通过路由解决而不是常规Javascript设计模式,在这种模式中,您经常考虑将公共代码打包到共享函数中。