gpt4 book ai didi

angular - 从 Firestore 获取文档时的错误处理

转载 作者:行者123 更新时间:2023-12-03 14:39:28 25 4
gpt4 key购买 nike

在带有 FireStore 和 angularfire2 的 Angular 5 中,通过 Controller 从服务获取文档时处理错误的正确方法是什么?

服务:

getInviteById( inviteId: string ): Promise<any> {    

// get requested invite from firestore
var inviteDocument = this.afs.collection( 'invites' ).doc( inviteId );
let invite = inviteDocument.ref.get().then( doc => {

// if document exists
if (doc.exists) {

// return id and data
const id = doc.id;
var data = doc.data() as any;
return { id, ...data };

// if document does not exist
} else {
console.log("Error: No such document!");

// WHAT DO I NEED TO RETURN HERE???
}

// if other error
}).catch(function(error) {
console.log("Error: Getting document:", error);

// WHAT DO I NEED TO RETURN HERE???
});

// return invite
return invite;
};

Controller :
this.inviteService.getInviteById( inviteId )
.then( resolve => {
this.invite = resolve;
})
.catch( err => {
// THIS NEVER GETS CALLED !
console.log("INVITE-COMPONENT: Cannot get invite for this id." );
});

如果 FireStore 中存在具有邀请 ID 的文档,则一切正常。但是,如果 FireStore 中没有与邀请 ID 对应的文档,则该服务将记录“错误:没有此类文档!” (正如预期的那样),但是组件不会进入它自己的 catch案件。

如何处理组件中的“无此类文档”错误 ,以便我可以相应地修改我的用户界面?

最佳答案

您可以返回被拒绝的 promise ,但更简单 throw .
所以,直截了本地,你可以写:

// (1) ILLUSTRATIVE - NOT YET THE FULL SOLUTION
getInviteById(inviteId: string): Promise<any> {
var inviteDocument = this.afs.collection('invites').doc(inviteId);
return inviteDocument.ref.get()
.then(doc => {
if (doc.exists) { // if document exists ...
const id = doc.id;
var data = doc.data() as any;
return {id, ...data}; // ... return id and data.
} else { // if document does not exist ...
throw new Error('No such document!'); // ... throw an Error.
}
})
.catch(error => {
throw new Error('Error: Getting document:'); // throw an Error
});
};
然而,内部 throw会立即被外层 .catch() 捕获和“没有这样的文件!”错误消息将丢失,以支持“错误:正在获取文档:”。
可以通过如下调整整体模式来避免这种损失:
// (2) ILLUSTRATIVE - NOT YET THE FULL SOLUTION
getInviteById(inviteId: string): Promise<any> {
var inviteDocument = this.afs.collection('invites').doc(inviteId);
return inviteDocument.ref.get()
.catch(error => { // .catch() error arising from inviteDocument.ref.get()
throw new Error('Error: Getting document:');
})
.then(doc => {
if (doc.exists) {
const id = doc.id;
var data = doc.data() as any;
return {id, ...data};
} else {
throw new Error('No such document!'); // can now be caught only by getInviteById's caller
}
});
};
然而,即使这样也不正确,因为存在以下可能性:
  • this.afs.collection('invites').doc(inviteId)可能会返回 null ,在这种情况下应该抛出错误。
  • this.afs.collection('invites').doc(inviteId)inviteDocument.ref.get()可能会同步抛出。

  • 在任何一种情况下,调用者都有权期望返回 promise 的函数总是异步抛出,而不管错误是如何/在哪里出现的。
    可以通过确保 var inviteDocument = this.afs.collection('invites').doc(inviteId); 来克服该伪像。和 inviteDocument.ref.get()从 promise 链和 null 内部执行案件处理妥当,如下:
    // (3) SOLUTION
    getInviteById(inviteId: string): Promise<any> {
    return Promise.resolve() // neutral starter promise
    .then(() => {
    var inviteDocument = this.afs.collection('invites').doc(inviteId); // now executed inside promise chain
    if(inviteDocument) {
    return inviteDocument.ref.get(); // now executed inside promise chain.
    } else {
    throw new Error(); // no point setting an error message here as it will be overridden below.
    }
    })
    .catch(error => {
    throw new Error('Error: Getting document:');
    })
    .then(doc => {
    if (doc.exists) {
    const id = doc.id;
    var data = doc.data() as any;
    return {id, ...data};
    } else {
    throw new Error('No such document!');
    }
    });
    };
    调用者(您的 Controller )将捕获并记录由 getInviteById() 引起的任何错误。 :
    this.inviteService.getInviteById(inviteId)
    .then(result => { // better not to name the variable `resolve`
    this.invite = result;
    })
    .catch(err => {
    console.log("INVITE-COMPONENT: Cannot get invite for this id: " + error.message);
    });
    备注
  • console.log()内部不需要getInviteById() (除了可能在调试时)。来电者 .catch()将做所有必要的日志记录。
  • 关于angular - 从 Firestore 获取文档时的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49120326/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com