我在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
,那么我会在下一行得到undefined
和1
。据我了解,类似这样的事情很正常,为了解决它,transferstate
开始起作用,但是据我了解,TransferHttpCacheModule
基本上是执行transferstate
的简便方法。我也尝试过将transferstate
写到解析器中,结果是相同的-仅发出一个请求,但该请求将无法访问会话。
我希望从前端发出HTTP请求时我丢失了某些内容,或者我的会话/核心信息丢失了某些内容。在这一点上,我已经不知道要检查或测试什么,欢迎您提出任何提示。
答案 0 :(得分:0)
因此,我开始在Angular中建立身份验证以使用localStorage
。我遇到了问题,在寻找解决方案时遇到了有关isPlatformBrowser
的教程。所以我开始思考,也许Angular Universal在某种程度上发出了两个请求,但是这两个请求是不同的,因此我需要消除其中一个。因此,我最终用if(isPlatformBrowser(this.platformId)) { }
包装了我的http请求,到目前为止,似乎我的问题已解决。