Node.js 如何在跨源请求中保留会话数据?

Node.js 如何在跨源请求中保留会话数据?,node.js,session,express,connect,cors,Node.js,Session,Express,Connect,Cors,我刚开始使用Express和Connect,所以我希望我正在做一些愚蠢的事情,有一个简单的解决方案 基本上,我有一个用户使用角色登录的页面。为了验证身份验证尝试,我使用。据推测,此模块将用户的已验证电子邮件地址保存在会话变量(默认情况下为req.session.email)中 现在,在登录后,用户可以发布评论,该评论将与用户登录的电子邮件地址一起保存。当为表单提供服务的服务器与处理评论发布的服务器相同时,这可以正常工作。但是,当它们不同时(假设用户在http://localhost:8001,而

我刚开始使用Express和Connect,所以我希望我正在做一些愚蠢的事情,有一个简单的解决方案

基本上,我有一个用户使用角色登录的页面。为了验证身份验证尝试,我使用。据推测,此模块将用户的已验证电子邮件地址保存在会话变量(默认情况下为req.session.email)中

现在,在登录后,用户可以发布评论,该评论将与用户登录的电子邮件地址一起保存。当为表单提供服务的服务器与处理评论发布的服务器相同时,这可以正常工作。但是,当它们不同时(假设用户在
http://localhost:8001
,而浏览器随后向
http://localhost:8000
应保存注释),req.session.email值突然变为
未定义

我认为我正确设置了跨源资源共享。表单被发送(使用jQuery):

(注意
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请求中发送的值相同

但是:
console.log(req.session.email)
显示跨来源请求的
undefined
——同样,当请求来自同一来源时,它可以正常工作


我做错了什么?

我发现了我的问题:我忘了发送带有身份验证请求的cookies。因此,Express服务器在登录时无法识别当前用户的会话,因此无法将用户数据保存到会话

解决方案是使用
withCredentials
标志发送角色断言请求,如下所示:

var response = $.ajax(assertionUrl + '/verify', {
    data: {assertion: assertion},
    type: 'POST',
    xhrFields: {withCredentials: true}
});

(我不认为任何人会遇到完全相同的问题,但以防万一……

对于那些希望用角度实现解决相同问题的人来说。您可以使用以下方式配置$http以发送cookies:

.config(function ($routeProvider, $httpProvider) {
    $httpProvider.defaults.withCredentials = true;
    //rest of route code

您将console.log语句放在哪里?Express.use()语句是什么样子的?您是否在express pesona中间件有机会运行和更新会话信息之前运行console.log?console.log()位于express应用程序中,在使用()初始化角色和注释处理模块后被调用--当请求来自同一来源时,他们输出了正确的值。我再也找不到原始链接了。我已经把它从我的帖子上删除了
.config(function ($routeProvider, $httpProvider) {
    $httpProvider.defaults.withCredentials = true;
    //rest of route code