在我的server.js文件(我的Node js api)上,我已经设置了
var corsOptions = {
origin: 'https://mydomain.tld',
credentials: true,
optionsSuccessStatus: 200
}
app.use(cors(corsOptions));
为了测试是否我可以设置cookie(没有任何ajax请求)我成功使用
app.get('/test1', (req, res) => {
res.setHeader('Set-Cookie', cookie.serialize('name', String("John Doe"), {
httpOnly: true,
maxAge: 60 * 60 * 24 * 7 // 1 week
}));
return res.json({message : "Cookie set"});
});
app.get('/test2', (req, res) => {
var cookies = cookie.parse(req.headers.cookie || '');
var m = cookies.name;
if (m) {
return res.json({name : m});
}
});
这完美有效。 在客户端,我想用Ajax(用户名)执行POST请求,在我的服务器上,我想保留一个带有用户名的cookie。
所以客户端:
var data = {};
data.name = document.getElementById("name").value;
$.ajax({
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
crossDomain: true,
xhrFields: { withCredentials: true },
url: HOST+'/step1',
success: function(data) {
if (data.code == 200) {
doStuff(data);
}
else if (data.code == 100) {
complainAboutStuff(data);
}
}
});
服务器端:
app.post('/step1', (req, res) => {
res.setHeader('Set-Cookie', cookie.serialize('name', String(req.body.name), {
httpOnly: true,
maxAge: 60 * 60 * 24 * 7 // 1 week
}));
return res.json();
});
然而它没有存储任何cookie,如果我回到/ test2它没有显示名称,并且使用Firefox Developer工具我可以清楚地看到它从未被设置。
我不明白为什么
crossDomain: true,
xhrFields: { withCredentials: true },
是不够的(由于我设置的corsOptions,我的浏览器/服务器中没有任何关于CORS的警告。
如果您有任何想法,或者我可以使用的解决方法? 我哪里错了? 谢谢