我的HTTP Firebase Cloud Function每隔这么多次运行就会收到此错误:
Function execution took ****ms, finished with status: 'connection error'
它发生不一致,但我不能完全缩小问题所在。我不相信错误出在我的应用程序中,因为它没有显示错误打印输出。在运行此云功能时,我自己与Firebase的联系并没有中断。
知道为什么Firebase随机使云函数执行失败并显示"连接错误"吗?
Function execution took ****ms, finished with status: 'connection error'
或ECONNRESET
通常发生在函数不知道承诺是否解析时。
每个承诺都必须返回,如此处的文档中所述。还有一篇关于此的博客文章(带有有用的视频!
几个未返回的承诺示例:
exports.someFunc = functions.database.ref('/some/path').onCreate(event => {
let db = admin.database();
// UNRETURNED PROMISE
db.ref('/some/path').remove();
return db.ref('/some/other/path').set(event.data.val());
});
exports.makeUppercase = functions.database.ref('/hello/{pushId}').onWrite(event => {
return event.data.ref.set('world').then(snap => {
// UNRETURNED PROMISE
admin.database().ref('lastwrite').set(admin.database.ServerValue.TIMESTAMP);
});
});
exports.makeUppercase = functions.database.ref('/hello/{pushId}').onWrite(event => {
// UNRETURNED PROMISE
event.data.ref.set('world').then(snap => {
return admin.database().ref('lastwrite').set(admin.database.ServerValue.TIMESTAMP);
});
});
为了在部署代码之前帮助捕获此错误,请查看此 eslint 规则。
要深入了解承诺,这里有一些有用的资源:
- Mozilla 文档
- Ponyfoo 承诺深入探讨
- 链接到 ECMA 标准
- Egghead.io 课程
即使此问题具有批准的答案,您可能已按照该答案中的步骤操作,并且仍然达到了仍然发生错误的点。
在这种情况下,GCP 通知我们节点 8 CF 存在已知问题和此连接错误,解决方法是将节点版本更新为 10。
相关 github 问题:https://github.com/firebase/firebase-functions/issues/429
具体评论:https://github.com/firebase/firebase-functions/issues/429#issuecomment-577324193
我认为可能是同时连接火力数据库的太多:/https://groups.google.com/forum/#!topic/firebase-talk/4RjyYIDqMVQ
我在将卸载跟踪事件部署到安卓设备的火力基地时遇到了同样的问题,
事实证明,我尝试访问的属性仅适用于某些用户,因此,当它找不到其他用户的属性时,它会给出此错误
因此,首先只需检查您尝试访问的属性是否存在
我一直在HTTP触发器上得到这个,该触发器立即调用response.end((,没有其他代码!
我有一个非常复杂的功能,运行良好,然后由于此错误而停止工作。我尝试了几个小时玩我的代码,直到除了 response.end(( 之外什么都没有了,但错误仍然存在。
我发现通过删除触发器(在注释掉有问题的触发器的情况下部署我的触发器(,然后在未注释的触发器的情况下再次部署似乎已经修复了它。
也许有一个错误可以在您删除云中的触发器时重置。
希望这可以避免一些挫败感。
可能是过时的库。
转到终端
内部函数文件夹写入命令
npm 过时
这将显示需要更新的所有库。
- 更新库写入命令
NPM 更新
- 使用 部署云函数
Firebase 部署 --仅函数
出于调试目的,我做了以下操作:
response.send(someArray.length)
。结果如下:
response.send(218)
。这导致了无正文响应,只发送了一个"状态代码"(即 218(。为了解决这个问题,我做了:
response.send("count: " + someArray.length)