我有一个Spartacus/SAP Composable Storefront应用程序,使用Angular SSR(Express).我实际上试图做的是用SSR执行301重定向,其中替换URL是通过调用外部API来动态组装的,以检索替换URL的必要部分.
在一个服务类中,我给SSR的响应对象注入了@Inject(RESPONSE)
.此外,在同一个服务中,URL重定向逻辑在HTTP客户端调用前面提到的API返回的Observable的subscribe块中完成.在subscribe块中,我将把SSR的响应对象的HTTP状态设置为301,并把它的位置设置为新组装的替换URL.
一旦代码到达"server.ts"片段中的res.render
的回调块,如下所示,res.redirect
将被调用.
server.get('*', (req, res) => {
res.render(indexHtml, {
req,
providers: [{provide: APP_BASE_HREF, useValue: req.baseUrl}],
}, (err, html) => {
if (res.statusCode === 301 || res.statusCode === 302) {
res.redirect(res.statusCode, (res.header as any).REDIRECT_URL)
}
//more logic here
});
});
所有这些都是正常工作时,没有太多的交通.然而,当我们的Spartacus应用程序有很多并发请求时,我意识到在"server. ts"中,"req"有时会与来自同一应用程序的另一个请求的完全无关的"res"配对.导致错误的301重定向.
起初,我怀疑这可能是一个Escc问题(种族条件),我需要阻止SSR渲染之前提到的可观察是解决.因此,我try 实现一个Angular解析器,并将外部HTTP调用放在resolve
方法中.然后,通过订阅ActivatedRoute
的数据来访问组装替换URL所需的数据,我实现了相应组件的ngOnInit
方法中SSR响应对象的状态和位置的更新.然而,我仍然看到同样的问题,即'res'和'req'将间歇性地得到不匹配.
我想知道是什么可能导致这个问题?它可能仍然是一个竞争条件问题,因为我可能没有正确实现Angular解析器(我对Angular和FE开发非常陌生),或者这是一个并发问题,即另一个请求的响应干扰了另一个线程/会话的请求.
我非常感谢在这个问题上的一些帮助和指导,因为我已经被困了很长一段时间了.