使用AngularJS的Express会话

jjhzyzn0  于 2023-05-28  发布在  Angular
关注(0)|答案(2)|浏览(156)

我正在尝试使用express和angularjs创建一个简单的登录。angular js应用程序运行在一个单独的服务器上(grunt服务器localhost:9000),而express应用程序运行在另一个端口上。对于我的express应用程序,我设置了以下标题:

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();
});

我正在运行angular 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来托管angular应用程序,这样就可以解决所有这些问题,但我宁愿将这两个项目/服务器分开。
这是/session请求的视图,连接会话cookie附加到请求:

7rfyedvj

7rfyedvj1#

所以如果我把你的设置弄对了,你有:

angularjs running on grunt server <---> express server

你想访问快速服务器上的会话?如果是这种情况,那么您需要一种在这两个服务器之间共享会话的方法。我建议使用redis-connect模块(还有express-mongodb)。它将会话对象存储在两个服务器都可以访问的redis数据库中。我以前从未使用过grunt服务器,但我使用过两个express服务器。MemoryStore在这里不起作用,因为你有两个独立的进程,它们不会共享相同的内存。

6uxekuva

6uxekuva2#

我不得不在几个不同的东西上乱弄才能让这个工作。首先,我升级到了edge angular,因为我需要的一些值不能全局默认为$http。
在Angular config()步骤中,我添加了:

// Add COR ability
$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.withCredentials = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

在express中,我创建了一个angular中间件:

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();
};

相关问题