如何解决您的函数被终止,因为它在我的Firebase模拟器中引发了一个未处理的错误?

ecfsfe2w  于 2022-12-19  发布在  其他
关注(0)|答案(4)|浏览(119)

我正在尝试使用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块,但是为什么它仍然被认为是一个未处理的错误?如何解决这个问题?
对不起,我是一个节点初学者,我是一个移动的开发人员。所以我很抱歉,如果我的问题是有点愚蠢

v09wglhw

v09wglhw1#

当你没有捕捉到Promises生成的错误时,这被认为是一个未处理的错误。它看起来像你试图删除一个不存在的对象,所以它抛出了一个你在Promise.all调用中没有捕捉到的错误。
要修复代码而不对其进行实质性更改,只需将.catch()添加到Promise.all()调用中。

Promise.all(promises)
  .catch(() => console.error("Oh no, an error occurred!"));

简而言之,一个承诺应该总是至少有以下功能之一:.then().catch().finally()

糟糕

myFunction.doSomethingReturnPromise();

很好

myFunction.doSomethingReturnPromise().then();
另一个要点是Promise.all()是all-or-nothing,这意味着如果一个promise失败,它会立即退出。如果文件不存在,你应该单独运行每个promise,否则你需要创建 Package 函数来删除总是能解决的文件。
也不要把你所有的代码都 Package 在try/catch中,而是单独处理每个操作,但是我假设你实际上并不关心它是否成功,对吗?
下面是我编写这个函数的方法:

/**
 * Generic delete funcion that will call .delete() on storage objects or database nodes
 * @param doc
 */
const deleteObj = (doc) => {
    return new Promise((resolve: null) => {
        // Delete and resolve no matter what
        doc.delete()
            .finally(() => resolve());
    });
};

exports.onDelete = functions.firestore.document(path).onDelete((snapshot, context) => {
    const deletedUser = new User(snapshot.data());
    const defaultBucket = storage.bucket();

    // Since both types of objects have a similarly named .delete() function, we can use the same function
    // to delete them
    const promises = [
        deleteObj(db.doc(`devices/${deletedUser.uid}`)),
        deleteObj(defaultBucket.file(`profilePicture/${deletedUser.uid}`))
    ];

    Promise.all(promises)
      .finally(() => console.log("All done"));
});

注意:在我修改过的代码中,由于对Promise.all()的所有承诺都保证得到解决,所以我不需要添加.catch()或将其 Package 在try/catch中。

jdzmm42g

jdzmm42g2#

我也面临着同样的问题,但与异步/等待格式使用try/catch。我也不能弄清楚,直到我重新启动我的模拟器和错误神奇地消失了。

h43kikqp

h43kikqp3#

我也遇到过同样的问题。在我的例子中,我只是用下面的命令更新了firebase CLI。它对我很有效。
npm安装-g firebase工具

vkc1a9a2

vkc1a9a24#

每次调用firebase函数模拟器

时都会出现恼人的错误
在MacOS上,修复方法是删除firebase
第一个月
使用自动安装脚本安装
curl -sL firebase.tools | bash

相关问题