![](/img/trans.png)
[英]Firebase Cloud Function - How can I solve this error: ECONNRESET
[英]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 的异步/等待格式。 我也无法弄清楚,直到我重新启动我的模拟器并且错误神奇地消失了。
我也有这个问题,我尝试了这里建议的一切,但没有任何效果。 我通过切换我的节点版本 16(这是最新支持的)解决了这个问题,我用 19 运行模拟器。
我正在使用 nvm 来管理我的节点版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.