Ngx Translate资源读取异常:请求8080而非默认localhost:4200/assets
问题根因
问题出在全局注册的AuthInterceptor拦截器逻辑:该拦截器对所有通过HttpClient发起的请求无差别拼接了environment.baseUrl前缀(即http://localhost:8080),而Ngx Translate拉取翻译文件的请求本质也是走HttpClient发送的相对路径请求/assets/i18n/{lang}.json,所以被强制修改为指向8080端口的地址。
其他同environment配置的项目未出现该问题,是因为这类项目的拦截器普遍做了静态资源路径过滤,不会修改本地资源请求地址。
修复方案
提供两种可落地的修复方式,二选一即可:
方案1:修改拦截器逻辑,过滤静态资源请求(更推荐)
在拦截器拼接baseUrl前,先判断请求是否属于本地静态资源,匹配到/assets/路径的请求直接放行不修改地址:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { // 新增过滤逻辑:本地静态资源请求不拼接baseUrl if (req.url.startsWith('/assets/')) { return next.handle(req); } // 原有逻辑保留 const authReq = req.clone({ url: environment.baseUrl + req.url, headers: req.headers.set('Authorization', SessionService.getToken()) }); return next.handle(authReq) .pipe( tap(event => {}, err => { if (err instanceof HttpErrorResponse && (err.status === 401 || err.status === 403)) { this.loginService.logout(); } }) ); }
如果后续还有其他不需要拼接后端地址的请求,也可以把路径加到过滤规则里。
方案2:给Ngx Translate显式指定完整资源路径
初始化TranslateHttpLoader时直接传入完整的本地资源前缀,避免被拦截器修改后路径异常:
修改APP MODULE里的HttpLoaderFactory逻辑:
export function HttpLoaderFactory(httpClient: HttpClient) { // 显式指定资源路径,第二个参数是前缀,第三个是文件后缀 return new TranslateHttpLoader(httpClient, '/assets/i18n/', '.json'); }
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

