【发布时间】:2013-10-26 13:10:16
【问题描述】:
我是使用 Express 和 Connect 的新手,所以我希望我正在做一些愚蠢的事情,但有一个简单的解决方案......
基本上,我有一个用户使用 Persona 登录的页面。为了验证身份验证尝试,我使用express-persona。假设,此模块将用户的验证电子邮件地址保存在会话变量(req.session.email,默认情况下)中。
现在,登录后,用户可以发表评论,该评论将与用户登录的电子邮件地址一起保存。当提供表单的服务器与处理发布的服务器相同时的评论,这很好用。但是,当它们不同时(假设用户在http://localhost:8001 填写表单,而浏览器随后向http://localhost:8000 发送POST 请求,这应该保存评论),突然间req.session.email 值是undefined。
我认为我正确设置了跨域资源共享。表单是这样发送的(使用 jQuery):
$.ajax('http://localhost:8000/post/comment',
{
data: {comment: $('#commentField').val()},
type: 'POST',
xhrFields: {withCredentials: true}
}
);
(注意xhrField: {withCredentials: true}——会话cookie被传递,我通过检查网络请求来验证。)
服务器设置(我认为)正确的 CORS 标头:
res.header('Access-Control-Allow-Origin', 'http://localhost:8001');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
res.header('Access-Control-Allow-Credentials', 'true');
当我添加console.log(req.cookie) 时,我看到sessionId cookie 与随POST 请求一起发送的cookie 具有相同的值。
但是: console.log(req.session.email) 显示 undefined 用于跨域请求——同样,当请求来自同一来源时,它可以正常工作。
我做错了什么?
【问题讨论】:
-
您将 console.log 语句放在哪里?您的 Express .use() 语句是什么样的?您是否在 express-pesona 中间件有机会运行和更新会话信息之前运行 console.log?
-
console.log()s 在 Express 应用程序中,并在 use()ing Persona 和评论处理模块后被调用——当请求来自同一来源时,它们输出正确的值.
标签: node.js session express connect cors