我正在将 Angular 9 与 UpgradeModule 一起用于加载在旧式 JSP Web 应用程序中的应用程序。出于这个原因,我还使用了 MockLocationStrategy
来防止路由器弄乱旧应用程序的 URL(同时仍然使用路由器来更改 Angular 应用程序内的视图)。
Angular 应用在大部分时间里都能完美运行。问题是,在更改旧 url(地址栏中的那个)后,Angular 路由器无法导航到带有错误的路由:
TypeError: Cannot read property 'extractedUrl' of undefined
at eval [as project] (eval at <anonymous> (libs.js:567), <anonymous>:1:440708)
at e._next (eval at <anonymous> (libs.js:567), <anonymous>:1:320375)
at e.next (eval at <anonymous> (libs.js:567), <anonymous>:1:16834)
at e.notifyNext (eval at <anonymous> (libs.js:567), <anonymous>:1:321037)
at e._next (eval at <anonymous> (libs.js:567), <anonymous>:1:27334)
at e.next (eval at <anonymous> (libs.js:567), <anonymous>:1:16834)
at eval (eval at <anonymous> (libs.js:567), <anonymous>:1:24524)
at Q (eval at <anonymous> (libs.js:567), <anonymous>:1:27870)
at e._innerSub (eval at <anonymous> (libs.js:567), <anonymous>:1:320605)
at e._next (eval at <anonymous> (libs.js:567), <anonymous>:1:320440)
at j (zone.min.js:1)
at j (zone.min.js:1)
at zone.min.js:1
at e.invokeTask (zone.min.js:1)
at Object.onInvokeTask (eval at <anonymous> (libs.js:567), <anonymous>:1:128743)
at e.invokeTask (zone.min.js:1)
at t.runTask (zone.min.js:1)
at g (zone.min.js:1)
at t.invokeTask [as invoke] (zone.min.js:1)
at _ (zone.min.js:1)
我能够识别出引发错误的 Angular 路由器代码部分:
export function applyRedirects(
moduleInjector: Injector, configLoader: RouterConfigLoader, urlSerializer: UrlSerializer,
config: Routes): MonoTypeOperatorFunction<NavigationTransition> {
return switchMap(
t => applyRedirectsFn(moduleInjector, configLoader, urlSerializer, t.extractedUrl, config)
.pipe(map(urlAfterRedirects => ({...t, urlAfterRedirects}))));
}
applyRedirects
用于在路线导航过程中对 NavigationTransaction
对象应用转换。我无法理解的奇怪部分是,在调试时,事务对象在流上的前一个运算符中正确定义,但在到达 switchMap
上的 applyRedirects
时却没有。>
switchMap(t => {
const transition = this.transitions.getValue();
eventsSubject.next(new NavigationStart(
t.id, this.serializeUrl(t.extractedUrl), t.source,
t.restoredState));
if (transition !== this.transitions.getValue()) {
return EMPTY;
}
// This delay is required to match old behavior that forced
// navigation to always be async
return Promise.resolve(t); // HERE T IS DEFINED
}),
// ApplyRedirects
applyRedirects(
// INSIDE applyRedirects T IS UNDEFINED
this.ngModule.injector, this.configLoader, this.urlSerializer,
this.config),
谁能帮我了解可能出了什么问题?我什至在考虑这可能是 Angular Router 的错误。
PS:不幸的是,我在一家监管很多的金融机构工作,我无法发布任何源代码或屏幕截图,但我会尽量提供尽可能多的信息。