我正在尝试使用Firebase模拟器firebase emulators:start
运行下面的Firestore触发器代码
正如您所看到的,在firestore触发器中,我有一段代码可以删除存储在Firebase存储中的映像
我的代码:
exports.onDelete = functions
.firestore.document(path)
.onDelete((snapshot, context) => {
try {
const deletedUser = new User(snapshot.data());
const promise1 = db.doc(`devices/${deletedUser.uid}`).delete();
// deleting the image in Storage
const defaultBucket = storage.bucket();
const profilePictureFile = defaultBucket.file(`profilePicture/${deletedUser.uid}`);
const promise2 = profilePictureFile.delete();
const promises: Promise<any>[] = [promise1, promise2];
return Promise.all(promises);
} catch (error) {
console.log(error);
return Promise.reject(error);
}
});
因为Firebase模拟器目前没有存储模拟器,所以我预计会有一个错误。
但我有这样的警告
正如你在最下面看到的,有一个警告说
您的函数因引发未处理的错误而被终止。
这是一个严重的错误吗?我的意思是,我想我已经在我的代码中提供了try catch块,但是为什么它仍然被认为是一个未处理的错误?如何解决这个问题?
对不起,我是一个节点初学者,我是一个移动的开发人员。所以我很抱歉,如果我的问题是有点愚蠢
4条答案
按热度按时间v09wglhw1#
当你没有捕捉到Promises生成的错误时,这被认为是一个未处理的错误。它看起来像你试图删除一个不存在的对象,所以它抛出了一个你在
Promise.all
调用中没有捕捉到的错误。要修复代码而不对其进行实质性更改,只需将
.catch()
添加到Promise.all()
调用中。简而言之,一个承诺应该总是至少有以下功能之一:
.then()
、.catch()
或.finally()
糟糕
myFunction.doSomethingReturnPromise();
很好
myFunction.doSomethingReturnPromise().then();
另一个要点是
Promise.all()
是all-or-nothing,这意味着如果一个promise失败,它会立即退出。如果文件不存在,你应该单独运行每个promise,否则你需要创建 Package 函数来删除总是能解决的文件。也不要把你所有的代码都 Package 在try/catch中,而是单独处理每个操作,但是我假设你实际上并不关心它是否成功,对吗?
下面是我编写这个函数的方法:
注意:在我修改过的代码中,由于对
Promise.all()
的所有承诺都保证得到解决,所以我不需要添加.catch()
或将其 Package 在try/catch中。jdzmm42g2#
我也面临着同样的问题,但与异步/等待格式使用try/catch。我也不能弄清楚,直到我重新启动我的模拟器和错误神奇地消失了。
h43kikqp3#
我也遇到过同样的问题。在我的例子中,我只是用下面的命令更新了firebase CLI。它对我很有效。
npm安装-g firebase工具
vkc1a9a24#
每次调用firebase函数模拟器
时都会出现恼人的错误
在MacOS上,修复方法是删除firebase
第一个月
使用自动安装脚本安装
curl -sL firebase.tools | bash