我正在尝试使用express和angularjs创建一个简单的登录。角度js应用程序在单独的服务器(grunt服务器localhost:9000)上运行,而快速应用程序在另一个端口上运行。对于我的快递应用程序,我设置了以下标题:
app.all('/*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://localhost:9000");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
res.header("Access-Control-Allow-Credentials", "true");
next();
});
我正在运行角度1.0.7,这意味着我可以在配置步骤中设置一些默认值:
// Add COR ability
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$ http请求中的withCredentials:
$http({
method : "GET",
withCredentials : true,
url : apiEndpoint + '/session'
}, success);
因此,在使用我的应用程序登录后,会创建一个会话,并在响应中看到cookie。使用chrome调试工具,我可以看到连接会话cookie正在与下一个后续请求(上面的会话调用)一起发送。但是,在服务器上,req.session
属性仍为空。当然,我可以用express来托管角度应用程序并解决所有这些问题,但我宁愿将两个项目/服务器分开。
这是/session
请求的视图,其中连接会话cookie附加到请求:
答案 0 :(得分:1)
因此,如果我的设置正确,您可以:
angularjs running on grunt server <---> express server
您想要在快速服务器上访问会话吗? 如果是这种情况,那么您需要一种方法来共享这两个服务器之间的会话。 我建议使用redis-connect模块(还有express-mongodb)。它将会话对象存储在可以从两个服务器访问的redis数据库中。 我之前从未使用过grunt服务器,但我使用两台快速服务器完成了这项工作。 MemoryStore不会在这里工作,因为你有两个独立的进程,它们不会共享相同的内存。
答案 1 :(得分:0)
我不得不乱用几件不同的东西来实现这个目的。首先,我升级到边缘角度,因为某些值无法在我需要的$ http上全局默认。
在角度config()
步骤中,我添加了:
// Add COR ability
$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.withCredentials = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
在express中,我创建了一个角度中间件:
exports.angularHeaders = function(req, res, next){
res.header("Access-Control-Allow-Origin", '{{insert your ui endpoint}}');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Credentials", "true");
next();
};