[英]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.