繁体   English   中英

如何解决您的 function 被杀死是因为它在我的 Firebase 模拟器中引发了未处理的错误?

[英]how to solve Your function was killed because it raised an unhandled error in my Firebase emulator?

我正在尝试使用 Firebase 模拟器运行下面的 Firestore 触发器代码, firebase emulators:start

如您所见,在 firestore 触发器中,我有一个代码可以删除存储在 Firebase Storage 中的图像

我的代码:

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模拟器目前没有模拟器存储,所以我预计会出现错误。

但我有这样的警告

在此处输入图像描述

正如您在最底部看到的那样,有一条警告说

您的 function 已被终止,因为它引发了未处理的错误。

这是一个严重的错误吗? 我的意思是,我想我已经在我的代码中提供了 try catch 块,但为什么它仍然被视为未处理的错误? 如何解决这个问题?

抱歉,我是 Node 的初学者,我是一名移动开发人员。 如果我的问题有点傻,我很抱歉

当你没有捕捉到 Promises 产生的错误时,这被认为是一个未处理的错误。 看起来您正在尝试删除一个不存在的 object,因此它会引发您在Promise.all调用中没有发现的错误。

要在不大幅更改代码的情况下修复代码,只需在Promise.all()调用中添加.catch()即可。

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

简而言之,promise 应始终至少附加以下功能之一: .then( .then().catch().finally()

坏的

myFunction.doSomethingReturnPromise();

好的

myFunction.doSomethingReturnPromise().then();

另一个重要的一点是Promise.all()是全有或全无,这意味着如果一个 promise 失败,它会立即退出。 如果文件可能不存在,您应该单独运行每个 promise,否则您需要创建包装函数来删除始终解析的文件。

也不要将所有代码包装在 try/catch 中,而是单独处理每个操作。 但是,我假设您实际上并不关心它是否成功,对吗?

以下是我将如何编写此 function:

/**
 * 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()或将其包装在 try/catch 中。

我面临着同样的问题。 就我而言,我刚刚使用以下命令更新了 firebase CLI。它对我有用。

npm install -g firebase-tools

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

每次调用 firebase 函数模拟器时都会出现烦人的错误在此处输入图像描述

在 MacOS 上,修复是删除 firebase

npm uninstall -g firebase-tools

使用自动安装脚本安装

curl -sL firebase.tools | bash

我也有这个问题,我尝试了这里建议的一切,但没有任何效果。 我通过切换我的节点版本 16(这是最新支持的)解决了这个问题,我用 19 运行模拟器。

我正在使用 nvm 来管理我的节点版本。

暂无
暂无

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

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