[英]Firebase Functions: Unclear "connection error"
我的 HTTP Firebase Cloud Function 每次運行都會出現這個錯誤:
Function execution took ****ms, finished with status: 'connection error'
它發生不一致,但我不能完全縮小問題所在。 我不相信錯誤出現在我的應用程序中,因為它沒有顯示錯誤打印輸出。 在運行此雲 function 時,我自己與 firebase 的聯系並沒有中斷。
任何想法為什么 Firebase 會隨機使雲 function 執行失敗並出現“連接錯誤”?
Function execution took ****ms, finished with status: 'connection error'
有兩個主要原因:
幾個未返回承諾的例子:
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 規則。
為了深入了解 Promise,這里有一些有用的資源:
即使此問題的答案已獲批准,您也可能已按照該答案中的步驟操作,但仍然會出現錯誤。
在這種情況下,GCP 通知我們 Node 8 CF 存在一個已知問題和此連接錯誤,解決方法是將節點版本更新為 10。
相關 github 問題: https : //github.com/firebase/firebase-functions/issues/429
具體評論: https : //github.com/firebase/firebase-functions/issues/429#issuecomment-577324193
我認為它可能同時連接了太多的 Firebase 數據庫:/ https://groups.google.com/forum/#!topic/firebase-talk/4RjyYIDqMVQ
我在將uninstallTracking 事件部署到Android 設備的firebase 時遇到了同樣的問題,
原來我試圖訪問的屬性只對某些用戶可用,所以當它找不到其他用戶的屬性時,它會給出這個錯誤
所以首先檢查您要訪問的屬性是否存在
我在一個 HTTP 觸發器上得到了這個,它立即調用 response.end() 而沒有其他代碼!
我有一個非常復雜的功能,它運行良好,然后由於此錯誤而停止工作。 我嘗試了幾個小時來玩我的代碼,直到除了 response.end() 之外什么都沒有了,但錯誤仍然存在。
我發現通過刪除觸發器(在注釋掉違規觸發器的情況下部署我的觸發器),然后在未注釋觸發器的情況下再次部署似乎已經修復了它。
也許有一個錯誤可以在您刪除雲中的觸發器時重置。
希望這可以避免某些人的挫敗感。
它可能是過時的圖書館。
去終端
內部函數文件夾寫入命令
npm 過時了
這將顯示所有需要更新的庫。
更新
firebase deploy --only 功能
我仍然不時拋出connection error
。
這是我的代碼
exports.onDelete = functions
.runWith({ memory: "2GB" })
.firestore.document("SchoolClasses/{classId}")
.onDelete((snap, context) => {
if (context.params.classId === "warm")
return null;
console.log("start", context.eventType, Object.keys(context.params)[0], Object.values(context.params)[0], context.timestamp, Date.now() - Date.parse(context.timestamp));
if (Date.now() - Date.parse(context.timestamp) > 60000)
return null;
const classId = context.params.classId;
// we do nothing. At least right now. maybe later we have something todo
return Promise.resolve(`classId: ${classId} was deleted!`);
});
這個函數幾乎什么都不做,除了監聽SchoolClasses/{classId}
的文檔是否被刪除並返回一個帶有一些日志值的Promise.resolve
以便我可以看到在 firebase 控制台中發生了什么。
如果函數開始保溫或崩潰並且重試超過 1 分鍾,則 2 個 if 語句可以快速完成該函數。
額外信息:
connection error
很少發生出於調試目的,我執行了以下操作:
response.send(someArray.length)
……結果如下:
response.send(218)
...這導致了一個無體的響應,只是發送了一個“狀態代碼”(即 218)。 為了解決這個問題,我做了:
response.send("count: " + someArray.length)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.