Node.js 快速会话和请求模块
在我的网站中,服务器端的所有内容都存储在express session的会话中。 但我不明白,当我使用请求模块发出HTTP请求时,为什么req.session参数不在请求中。 我的意思是,遵循以下评论: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
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设计模式,在这种模式中,您经常考虑将公共代码打包到共享函数中。