Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了angular – 自定义错误处理程序抛出错误:无法读取未定义的属性“get”(Injector)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在角度4中构建一个自定义错误处理程序,以处理错误@L_618_4@器的不同类型的应用程序错误

创建一个基类(app-error.ts)和其他类(例如处理403错误创建类access-denied.ts),这些类扩展了这个基类.

在基类中注入了一个服务toastrservice,我想显示来自子类的自定义消息但是它给出了错误

无法读取未定义的属性’get’

这个问题与OOPS概念有关.我不明白如何获取覆盖父@L_874_15@或使用我的自定义参数调用.

TS v 2.3.3
角度v 4.3.4

app.module.ts

providers: [
{ provide: ErrorHandler,useClass: AppErrorHandler }
]

注意:AppErrorHandler类与AppError完全不同,AppError扩展了处理系统错误的角度ErorHandler接口.

错误@L_618_4@

import { Router } from '@angular/router';
import { Injectable,Injector } from '@angular/core';
import { httpInterceptor,httpResponse,httprequest,httpHandler,httpEvent,httpErrorResponse
} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/do';

import {
    AuthFail,BadInput,NotFoundError,ServerError,AppError,AccessDenied,} from '../shared/errors';
import { Authenticationservice } from './../authentication/authentication.service';


@Injectable()
export class ErrorInterceptor implements httpInterceptor {

    private auth: Authenticationservice;
    constructor(private router: Router,private injector: Injector) { }
    intercept(req: httprequest<any>,next: httpHandler): Observable<httpEvent<any>> {
        const auth = this.injector.get(AuthenticationservicE);
        return next.handle(req).catch((err: httpErrorResponsE) => {
            if (err instanceof httpErrorResponsE) {
                if (err.status === 401) {
                    return Observable.throw(new AuthFail(err.error));
                }
                if (err.status === 400) {
                    return Observable.throw(new BadInput(err.error));
                }
                if (err.status === 404) {
                    return Observable.throw(new NotFoundError());
                }
                if (err.status === 403) {
                    return Observable.throw(new AccessDenied());
                }
                return Observable.throw(new AppError(err));
            }
        });
    }
}

访问denied.ts

import { AppError } from './app-error';
export class AccessDenied extends AppError {
    constructor(public originalError?: any) {
        super();
        console.log('inside acces denied constructor');
        // super.handleError("superrrrr"); // this also doesn't work
    }

    public handleError(): void {
        console.log('handleError: ',);
        super.handleError("Access denined error occured");
    }
}

APP-error.ts

import { Inject,Injector } from "@angular/core";

import { Toastrservice } from "ngx-toastr";

export class AppError {
    toastrservice: Toastrservice;
    constructor(public originalError?: any,private injector?: Injector) {
        this.toastrservice = this.injector.get(ToastrservicE);
    }

    // NOTE: using getter seems impossible to access in child so add the same in constructor
    // get toastrservice(): Toastrservice {
    //  return this.injector.get(ToastrservicE);
    // }

    public handleError(msg: String): void {
        this.toastrservice.error(`Error message: ${msg}`,"Error",{
                closeButton: true,timeOut: 5000,onActivateTick: true
            }
        );
    }

}

给出错误

core.es5.js:1020 ERROR TypeError: CAnnot read property 'get' of undefined 
    at AccessDenied.AppError (app-error.ts:8) 
    at new AccessDenied (access-denied.ts:6)  
    at CatchSubscriber.eval [as SELEctor] (error.interceptor.ts:61) 
    at CatchSubscriber.error (catchError.js:105)
    at XMLhttprequest.onLoad (http.es5.js:1739)
    at ZoneDelegate.invokeTask (zone.js:421)
    at Object.onInvokeTask (core.es5.js:3881)
    at ZoneDelegate.invokeTask (zone.js:420)
    at Zone.runTask (zone.js:188)
    at ZoneTask.invokeTask [as invoke] (zone.js:496)
@H_262_45@解决方法
AccessDenied错误地扩展了AppError. super()导致注入器未定义,并且注入器在AppError构造函数中不应该是可选的,因为它是必需的.

可以通过强制参数来修复它:

constructor(private injector: Injector,public originalError?: any) {
    this.toastrservice = this.injector.get(ToastrservicE);
}

AccessDenied中可以省略构造函数.并且应该像新的AccessDenied(注入器)一样进行实例化.

这里真正的问题是AppError完成了它不应该做的工作.虑到它只是包含以后可以使用错误的appof instanceof确定的错误,它不应该执行当前在handleError中完成的副作用.

handleError中的逻辑可以移动到Toastrservice中的@L_874_15@,或者单独接受AppError实例的错误服务.如果需要为错误类型提供认消息,例如发生访问被拒绝错误,则AppError可以具有包含该消息的公共属性.

大佬总结

以上是大佬教程为你收集整理的angular – 自定义错误处理程序抛出错误:无法读取未定义的属性“get”(Injector)全部内容,希望文章能够帮你解决angular – 自定义错误处理程序抛出错误:无法读取未定义的属性“get”(Injector)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。