我使用谷歌云火库与一定数量的集合。我正在尝试编写一个google云函数,该函数在http请求时返回此firestore中的集合数。
所以我从index.js
写了以下this question文件图:
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。
我究竟做错了什么?
您需要在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的调用是异步的,您必须确保为此管理云功能的生命周期。
documentation states the following
- 通过返回JavaScript承诺来解析执行异步处理的函数(也称为“后台函数”)。
- 使用res.redirect(),res.send()或res.end()终止HTTP函数。
- 用return返回同步函数;声明。
你可以通过简单地向你的db.get()
添加一个return语句来解决这个问题。而且,为了摆脱你的lint错误,你应该从你的处理程序中返回一个值。你可以返回null
或只返回response.send()
通过省略return语句,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
正如关于HTTP云功能的official video所解释的那样,您应该在云功能中添加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);
})
});
但是,另外,如果我没有弄错,你的云函数中会有(另一个)错误:你做db.get()
但get()
没有Firestore service interface方法。您应该在get()
上调用CollectionReference
方法,因为您在返回的size()
(即QuerySnapshot
)上使用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);
})
});
请注意,您也可以在get()
上调用DocumentReference
。