我将Google Cloud Firestore用于一定数量的馆藏。 我正在尝试编写一个Google Cloud函数,以在HTTP请求时返回此Firestore中的集合数。
因此我从this question编写了以下index.js
文件图纸:
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。
我在做什么错了?
答案 0 :(得分:1)
Promise
完成后,您需要返回一个值,您可以执行以下操作:
exports.queryForData = functions.https.onRequest((request, response) => {
var db = admin.firestore();
return db.get().then(snap => {
response.status(200).send({length: snap.size});
})
});
答案 1 :(得分:1)
对Firestore的调用是异步的,您必须确保为此管理云功能的生命周期。
documentation states the following
- 解析执行异步处理的功能(也称为 “后台函数”),返回一个JavaScript Promise。
- 使用res.redirect(),res.send()或res.end()终止 HTTP函数。
- 终止带有返回的同步函数;声明。
您可以通过在db.get()
中添加一个return语句来解决此问题。而且,要摆脱棉绒错误,您应该从处理程序内部返回一个值。您可以返回null
,也可以返回response.send()
省略返回语句it will implicitly resolve to 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()
返回的promise将确保该函数保持活动状态,直到发送HTTP响应为止,并且将在该promise解析后终止该函数。
通过未正确完成函数,它们可能会运行直到超时。观看此视频:https://youtu.be/xu5A1seU6PU?t=233
答案 2 :(得分:1)
如关于HTTP Cloud Function的official video所述,您应将catch()
块添加到Cloud Function中,如下所示:
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()
,但没有get()
方法Firestore service interface。您应该在get()
上调用CollectionReference
方法,因为您正在对返回的QuerySnapshot
(即size()
)使用snap
方法:
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);
})
});
请注意,您也可以在DocumentReference
上致电get()
。