简体   繁体   English

订阅中未定义的错误处理-Apollo和Angular 2

[英]Error Handling For Undefined From Subscription - Apollo and Angular 2

I have the following code in Angular 2 querying a GraphQL endpoint using Apollo: 我在Angular 2中使用Apollo查询GraphQL端点有以下代码:

getStudentPersonalDetails(studentId?: number) {
    console.log(studentId)
    this.apollo.watchQuery<QueryResponse>({
        query: StudentPersonalDetailsQ,
        variables: {
            studentId: studentId
        }
    }).subscribe(({ data }) => {
        if (typeof data.allStudentDetails != 'undefined') {
            console.log(data)
            this.loading = data.loading;
            this.personalDetails.studentId = data.allStudentDetails.nodes[0].studentPk;
            this.personalDetails.firstName = data.allStudentDetails.nodes[0].firstName;
            this.personalDetails.middleName = data.allStudentDetails.nodes[0].middleName;
            this.personalDetails.lastName = data.allStudentDetails.nodes[0].lastName;
            this.personalDetails.preferredName = data.allStudentDetails.nodes[0].preferredName;
            this.personalDetails.onlyOneName = data.allStudentDetails.nodes[0].onlyOneName;
            this.personalDetails.dob = data.allStudentDetails.nodes[0].dob;
            this.personalDetails.sex = data.allStudentDetails.nodes[0].sex;
            this.personalDetails.birthCountry = data.allStudentDetails.nodes[0].metaCountryByBirthCountryId.countryName;
            this.personalDetails.passportCountry = data.allStudentDetails.nodes[0].metaCountryByPassportCountryId.countryName;
            this.personalDetails.passportNumber = data.allStudentDetails.nodes[0].passportNumber;
            this.personalDetails.contactCountry = data.allStudentDetails.nodes[0].metaCountryByContactCountryId.countryName;
            this.personalDetails.personalEmail = data.allStudentDetails.nodes[0].personalEmail;
            console.log(data.allStudentDetails);
        }
    }, (error) => {
        console.log('there was an error sending the query', error);
    });

I am testing the method by deliberately passing a student ID that doesn't exist and therefore getting back Cannot read property 'studentPk' of undefined . 我通过有意传递不存在的学生ID并因此返回Cannot read property 'studentPk' of undefined测试该方法。 However, I am trying to avoid this error by detecting if allStudentDetails is undefined and moving onto the error catch. 但是,我试图通过检测allStudentDetails是否未定义并转移到错误捕获来避免此错误。

How do I add error handling to deal with undefined data and then appropriately feed that up from the service to a component that will use a toaster to display a user friendly error? 如何添加错误处理以处理undefined数据,然后适当地将其从服务中馈送到将使用烤面包机显示用户友好错误的组件?

If I'm understanding the question, you could first run the response through map and throw an error at that level. 如果我理解这个问题,则可以先通过map运行响应,然后在该级别抛出错误。 Something like (this is untested, of course): 类似于(当然这未经测试):

getStudentPersonalDetails(studentId?: number) {
    console.log(studentId)
    this.apollo.watchQuery<QueryResponse>({
        query: StudentPersonalDetailsQ,
        variables: {
            studentId: studentId
        }
    }).map((data) => {
        console.log(data.allStudentDetails);
        if (typeof data.allStudentDetails.nodes[0] === 'undefined') {
            // Could also check if array length is 0
            // data.allStudentDetails.nodes.length <= 0
            throw new Error('This student does not exist!');
        }
        return data;
    }).subscribe((data) => {
        console.log(data)
        this.loading = data.loading;
        this.personalDetails.studentId = data.allStudentDetails.nodes[0].studentPk;
        this.personalDetails.firstName = data.allStudentDetails.nodes[0].firstName;
        this.personalDetails.middleName = data.allStudentDetails.nodes[0].middleName;
        this.personalDetails.lastName = data.allStudentDetails.nodes[0].lastName;
        this.personalDetails.preferredName = data.allStudentDetails.nodes[0].preferredName;
        this.personalDetails.onlyOneName = data.allStudentDetails.nodes[0].onlyOneName;
        this.personalDetails.dob = data.allStudentDetails.nodes[0].dob;
        this.personalDetails.sex = data.allStudentDetails.nodes[0].sex;
        this.personalDetails.birthCountry = data.allStudentDetails.nodes[0].metaCountryByBirthCountryId.countryName;
        this.personalDetails.passportCountry = data.allStudentDetails.nodes[0].metaCountryByPassportCountryId.countryName;
        this.personalDetails.passportNumber = data.allStudentDetails.nodes[0].passportNumber;
        this.personalDetails.contactCountry = data.allStudentDetails.nodes[0].metaCountryByContactCountryId.countryName;
        this.personalDetails.personalEmail = data.allStudentDetails.nodes[0].personalEmail;
    }, (error) => {
        console.log(error.message);
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM