Angular Universal / Node:后端不访问会话。在每次重新加载时创建新的

问题描述 投票:0回答:1

我在Angular Universal应用程序中使用基于会话的身份验证。问题是当http请求来自Angular应用程序时,后端(node.js)不访问正在进行的会话,而是创建新会话。你可能认为这是因为cors,但问题是,第一次初始加载只是不访问会话。因此,当我在具有解析程序或警卫的页面上打开我的应用程序时,就是在发出http请求。该http请求将创建新会话。然后导航到应用程序中的其他页面,一切正常。初始加载后发出的http请求将访问会话。如果我从没有解析器/警卫的页面开始然后导航到具有并发出http请求的页面,则此请求将访问会话。

以下是我在index.js中设置会话的方式:

var sessionStore = new MySQLStore(options);
app.use(
    session({
        key: 'sessionStorage',
        store: sessionStore,
        secret: config.get('demoSess'), 
        saveUninitialized: false, 
        resave: false,
        name: 'demo',
        cookie: { 
            maxAge: 60000,
            secure: false
        },
    })
)

const cors = require('cors');
app.use(cors({
    origin: [
        'http://localhost:4200'
    ], 
    credentials: true
    })
);

这就是从前端做出http请求的方式:

this.http.get(environment.apiUrl+'/server/page/auth', {withCredentials: true});

这应该是怎么回事?后端运行在端口8080和前端4200上。

app.module.ts,我写过TransferHttpCacheModule。如果我删除它,我可以从后端看到,当我控制日志时,第一个http请求被做了两次 - 首先一个不访问会话然后第二个访问会话。所以如果我在console.log(req.session.userId)/server/page/auth,我会在下一行获得undefined1。正如我所读到的,这样的事情是正常的并且绕过它,transferstate开始发挥作用,但据我所知,TransferHttpCacheModule基本上是简单的方式来做transferstate。我也尝试将transferstate写入解析器并且结果相同 - 只提出一个请求,但该请求不会访问会话。

当我从前端发出http请求或者我的session / cors缺少某些东西时,我希望我遗漏了一些东西。在这一点上,我不知道要检查或测试什么,任何暗示要检查的是欢迎。

angular7 angular-universal
1个回答
0
投票

所以我开始在Angular中构建我的身份验证以使用localStorage。我跑到那里遇到问题,在寻找解决方案时,我遇到了一些关于isPlatformBrowser的教程。所以我开始思考,也许Angular Universal在某种程度上提出了两个请求,但这两个请求是不同的,我需要消除其中一个。所以我最终用if(isPlatformBrowser(this.platformId)) { }包装了我的http请求,到目前为止我似乎已经解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.