簡體   English   中英

嘗試通過雲功能連接到 Firestore 時,為什么會出現“預期的捕獲()或返回”錯誤?

[英]Why do I get "Expected catch() or return"-error when trying to connect to firestore via cloud-function?

我使用帶有一定數量集合的 google cloud firestore。 我正在嘗試編寫一個谷歌雲函數,該函數根據 http 請求返回此 Firestore 中的集合數。

所以我從這個問題中編寫了以下index.js -file 繪圖:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.queryForData = functions.https.onRequest((request, response) => {
    var db = admin.firestore();
    db.get().then(snap => {
        response.status(200).send({length: snap.size});
        })
    }); 

部署后,我收到此錯誤:

在此處輸入圖片說明

奇怪的是:當我刪除行 var db = admin.firestore(); 我得到了同樣的錯誤。 所以我懷疑,我根本沒有正確連接到 firestore。

我究竟做錯了什么?

如 HTTP Cloud Function 的官方視頻所述,您應該向 Cloud Function 添加一個catch()塊,如下所示:

exports.queryForData = functions.https.onRequest((request, response) => {
    var db = admin.firestore();
    db.get()
    .then(snap => {
       response.status(200).send({length: snap.size});
       //Or response.send({length: snap.size});
    })
    .catch(error => {
       console.log(error);
       response.status(500).send(error);
    })
}); 

但是,此外,如果我沒記錯的話,您的 Cloud Function 中存在(另一個)錯誤:您執行db.get()Firestore 服務接口沒有get()方法。 您應該在CollectionReference上調用get()方法,因為您在返回的QuerySnapshot (即snap )上使用size()方法:

exports.queryForData = functions.https.onRequest((request, response) => {
    var db = admin.firestore();
    db.collection('collectionId').get()
    .then(snap => {
       response.status(200).send({length: snap.size});
       //Or response.send({length: snap.size});
    })
    .catch(error => {
       console.log(error);
       response.status(500).send(error);
    })
}); 

請注意,您還get()DocumentReference上調用get()

您需要在Promise完成后返回一個值,在您的情況下,您可以執行以下操作:

exports.queryForData = functions.https.onRequest((request, response) => {
var db = admin.firestore();
return db.get().then(snap => {
     response.status(200).send({length: snap.size});
    })
});

對 Firestore 的調用是異步的,您必須確保為此管理雲功能的生命周期。

文檔說明如下

  • 通過返回 JavaScript 承諾來解析執行異步處理的函數(也稱為“后台函數”)。
  • 使用 res.redirect()、res.send() 或 res.end() 終止HTTP 函數
  • 用 return 終止同步函數; 陳述。

您可以通過向db.get()添加 return 語句來解決此問題。 而且,為了擺脫 lint 錯誤,您應該從處理程序內部返回一個值。 您可以返回null或只返回response.send()

通過省略 return 語句, 它將隱式解析為undefined ... 這可能是您收到警告的原因。

exports.queryForData = functions.https.onRequest((request, response) => {
    var db = admin.firestore();
    return db.get().then(snap => {
        response.status(200).send({length: snap.size});
        return null;
        })
    }); 

db.get()返回的承諾將確保該函數保持活動狀態,直到您的 HTTP 響應被發送,並在承諾解決后終止該函數。

如果沒有正確完成您的功能,它們可能會一直運行到超時。 觀看此視頻: https : //youtu.be/xu5A1seU6PU?t=233

暫無
暫無

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

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