快速会话和请求模块
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
路线中使用的代码之间的一些共同代码,以便它们可以使用和共享共同的功能您将当前 req
和 res
传递给。然后你不需要解决这个 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
参数,这样您仍然可以访问它们并且可以根据您的情况使用正确的参数。
在我的网站中,服务器端的所有内容都存储在 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 并将其与您的 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
参数,这样您仍然可以访问它们并且可以根据您的情况使用正确的参数。