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

时间:2019-04-26 09:44:05

标签: angular7 angular-universal

我在Angular Universal应用中使用基于会话的身份验证。问题是,当从Angular应用发出http请求时,后端(node.js)无法访问正在进行的会话,而是创建新会话。您可能认为这是因为cors,但事实是,第一个初始加载仅不访问会话。因此,当我在具有解析器或防护程序的页面上打开应用程序时,即发出了HTTP请求。该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请求时我丢失了某些内容,或者我的会话/核心信息丢失了某些内容。在这一点上,我已经不知道要检查或测试什么,欢迎您提出任何提示。

1 个答案:

答案 0 :(得分:0)

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