Javascript 在node.js脚本中创建cookie
我正在尝试node.js脚本。我尝试过使用express/cookie解析器&没有。。。 ATM我在本地模式下工作,但我将在werbserver上使用它 在我所有的尝试中,我得到了任何错误,但饼干没有 我最后一次尝试(没有express/cookie解析器):Javascript 在node.js脚本中创建cookie,javascript,node.js,express,cookies,Javascript,Node.js,Express,Cookies,我正在尝试node.js脚本。我尝试过使用express/cookie解析器&没有。。。 ATM我在本地模式下工作,但我将在werbserver上使用它 在我所有的尝试中,我得到了任何错误,但饼干没有 我最后一次尝试(没有express/cookie解析器): consthttp=require('http'); 常数fs=要求('fs'); 常数端口=53134; const url=require('url'); const fetch=require('node-fetch'); let
consthttp=require('http');
常数fs=要求('fs');
常数端口=53134;
const url=require('url');
const fetch=require('node-fetch');
let express=要求('express');
设app=express();
让cookieParser=require('cookie-parser');
使用(cookieParser());
http.createServer((req,res)=>{
让responseCode=404;
让内容='404错误';
const urlObj=url.parse(req.url,true);
让伊塞克莱尔=假;
if(urlObj.query.code){
const accessCode=urlObj.query.code;
log(`访问代码为:${accessCode}`);
常数数据={
客户id:'805884181811822624',
客户机密:“JRSPE0nmRn881Mi9cLC gMozHKWLQVPT”,
授权类型:“授权码”,
重定向_uri:'http://localhost:53134',
代码:accessCode,
范围:“识别行会”,
};
取('https://discord.com/api/oauth2/token', {
方法:“POST”,
正文:新的URLSearchParams(数据),
标题:{
“内容类型”:“应用程序/x-www-form-urlencoded”,
},
})
.then(discordRes=>discordRes.json())
。然后(信息=>{
控制台日志(信息);
退货信息;
})
.then(info=>fetch()https://discord.com/api/users/@我",{
标题:{
授权:`${info.token\u type}${info.access\u token}`,
},
}))
.then(userRes=>userRes.json()。然后(userData=>{
console.log(userData);
取回(`https://discord.com/api/guilds/799385448824438824/members/${userData.id}`{
标题:{
授权:`Bot ODA1ODg0MTgxODExODIyNjI0.YBhYIQ.h4zLzR7ybBC1uvFSb4iZTH JVhM`,
},
})
.then(guildRes=>guildRes.json()。then(guildata=>{
console.log(guildata)
对于(让i=0;i编写服务器请求处理程序的方式,它总是调用以下命令:
res.writeHead(responseCode, {
'content-type': 'text/html;charset=utf-8',
});
res.write(content);
res.end();
然后,在fetch()
调用完成后的某个时间,它可能会尝试设置您的cookie。到那时,响应已经发送,已经太晚了。因此,您的cookie永远不会发送。要解决此问题,您必须重新构造代码,以便在您进入调用fetch()的分支时
,则根本不执行上述代码,以便fetch()
响应处理程序可以发送它想要的响应
此外,在尝试设置cookie的代码中,您可以执行以下操作:
res.writeHead(200, { 'Set-Cookie': 'cookie', 'Content-Type': 'text/plain' });
res.writeHead(301, { Location: `http://localhost:53134/?code=${accessCode}` });
res.end();
这毫无意义。您可以res.writeHead()
一次且仅一次(您可以在一次调用中设置多个标头)。并且,您可以为请求获取一个且仅一个状态代码,而不是两个。选择一个或另一个。为什么要res.writeHead(200,…)
然后立即执行res.writeHead(301,…)
?选择一个或另一个-不能同时执行这两个操作。您可以在对res.writeHead()
的一次调用中设置多个头,但只能有一个状态值和一个对此方法的调用。此外,您在for
循环中调用res.writeHead()
,该循环可能会多次调用它。
res.writeHead(200, { 'Set-Cookie': 'cookie', 'Content-Type': 'text/plain' });
res.writeHead(301, { Location: `http://localhost:53134/?code=${accessCode}` });
res.end();