处理Angular 5路由器中的URL解析错误

时间:2018-04-05 19:00:15

标签: angular url angular-routing angular-router

我正在Angular 5中重写AngularJS 1.5应用程序。该应用程序支持复杂搜索,其中影响搜索结果的所有参数都包含在URL /路径路径中。用户可以将搜索URL添加为书签,以重新应用相同的搜索条件。

1.5 app的ui-router配置将路径路径参数与/分开,其中一些参数是对象,因此配置的格式为/{parameter1:json}/:parameter2/{parameter3:json}/。 Angular 5不支持同样的方法。我必须为格式为/:parameters的所有参数使用单个JSON编码对象。

我正在实现遗留支持路由,该路由可识别用户何时尝试访问旧版(1.5)搜索URL,而是将用户引导到应用了相同参数的新(5)URL。在大多数情况下,这都可以。

然而,遗留应用程序未对其某些参数进行正确的URL编码。这在1.5 ui-router中没有出现任何问题,但Angular 5路由器错误ERROR Error: Cannot parse url '/...且应用程序因空白内容而失败 - 它不会重定向到任何地方。

未编码的URL参数已经“在野外”,因此我需要处理无法解析URL的场景。不幸的是,the documentation似乎没有提供任何方法来处理URL解析中的错误。

编辑:在RouterModule.forRoot的配置对象中提供errorHandler不会发现错误。向应用程序添加全局ErrorHandler类没有用,因为错误对象不会告诉我它是路由错误还是其他类型的错误。

有什么方法可以捕获URL解析错误,或者为错误情况提供回退行为?

1 个答案:

答案 0 :(得分:1)

您可以使用UrlSerializer来更改网址行为,以下是从网址中删除括号的示例

 import { UrlTree ,DefaultUrlSerializer, UrlSerializer } from '@angular/router';

export class cleanUrlSerializer extends DefaultUrlSerializer {  
public parse(url: string): UrlTree {
 function cleanUrl(url) {
    return url.replace(/\(|\)/g,'') // for example to delete parenthesis
 }
 return super.parse(cleanUrl(url));
}
}

导入此类并将其添加为模块中的提供程序

providers: [
{
    provide: UrlSerializer,
    useClass: cleanUrlSerializer 
}
]