簡體   English   中英

Firebase 功能:不清楚“連接錯誤”

[英]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'有兩個主要原因:

  1. 在使用 Spark 計划時嘗試調用非 Google 服務(請參閱定價頁面)。 這可以通過升級到付費計划來解決。

  1. 函數不知道承諾是否已解決。 正如此處的文檔中所述,每個承諾都必須返回。 還有一篇關於此的博客文章(帶有有用的視頻!)

幾個未返回承諾的例子:

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() 之外什么都沒有了,但錯誤仍然存​​在。

我發現通過刪除觸發器(在注釋掉違規觸發器的情況下部署我的觸發器),然后在未注釋觸發器的情況下再次部署似乎已經修復了它。

也許有一個錯誤可以在您刪除雲中的觸發器時重置。

希望這可以避免某些人的挫敗感。

它可能是過時的圖書館。

  1. 去終端

  2. 內部函數文件夾寫入命令

npm 過時了

這將顯示所有需要更新的庫。

  1. 更新庫寫入​​命令

更新

  1. 部署雲功能

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 語句可以快速完成該函數。

額外信息:

  • 我正在運行 Baze 計划
  • 我已開啟重試
  • 我在許多其他功能中也有同樣的問題
  • 我已經設置了 TS-linter 以防止未解決的承諾
  • 我發布的代碼被打字稿編譯器轉換成這個
  • connection error很少發生

出於調試目的,我執行了以下操作:

response.send(someArray.length)

……結果如下:

response.send(218)

...這導致了一個無體的響應,只是發送了一個“狀態代碼”(即 218)。 為了解決這個問題,我做了:

response.send("count: " + someArray.length)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM