Javascript 为什么我会得到;预期的catch()或return-尝试通过云功能连接firestore时出错?
我使用google cloud firestore收集一定数量的数据。 我正在尝试编写一个googlecloud函数,根据http请求返回firestore中的集合数 因此,我编写了以下Javascript 为什么我会得到;预期的catch()或return-尝试通过云功能连接firestore时出错?,javascript,node.js,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,我使用google cloud firestore收集一定数量的数据。 我正在尝试编写一个googlecloud函数,根据http请求返回firestore中的集合数 因此,我编写了以下index.js-文件绘图: 部署后,出现以下错误: 奇怪的是:当我删除行vardb=admin.firestore()时我得到了完全相同的错误。所以我怀疑,我根本没有正确连接到firestore 我做错了什么?您需要在承诺完成后返回一个值,在您的情况下,您可以执行以下操作: exports.queryForD
index.js
-文件绘图:
部署后,出现以下错误:
奇怪的是:当我删除行vardb=admin.firestore()时代码>我得到了完全相同的错误。所以我怀疑,我根本没有正确连接到firestore
我做错了什么?您需要在承诺完成后返回一个值,在您的情况下,您可以执行以下操作:
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函数
- 用返回键终止同步函数;声明
只需向db.get()
添加一条return语句,就可以解决这个问题。此外,为了消除lint错误,应该从处理程序内部返回一个值。您可以返回null
,也可以只返回响应。send()
通过省略返回语句。。。这可能是你得到警告的原因
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响应发送之前保持活动状态,并在承诺解析后终止函数
如果没有正确完成函数,它们可能会一直运行到超时。请参阅此视频:如HTTP云函数所述,您应该向云函数添加一个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()
方法。您应该在上调用方法,因为您在返回的(即snap
)上使用size()
方法:
请注意,您也可以在上调用get()
。谢谢。现在我再也没有7:16的错误了。但是我仍然在7:2中遇到同样的错误。再次部署函数添加一个catch,然后.catch(e=>{console.log(e);response.sendStatus(404);
您应该已经添加了一个catch,可能响应失败了尝试显式返回null
值或在响应.status()前面放置一个返回值…
语句。linter可能不喜欢将承诺隐式解析为未定义的
。这看起来像是linter警告,而不是运行时错误。@Bergi它确实是linter警告。这给了我:“每个then()应该返回值或抛出承诺/始终返回”。是否该函数根本找不到firestore?这是我的怀疑。从Firebase的角度来看,代码是正确的(如回答中所述,请参阅Firebase视频)但是,正如其他答案所指出的那样,您会遇到一个lint错误。我不知道如何解决这个问题。您可以按照@Dennis Alund的建议,在响应之后添加一个返回null;
。send()…
,但我感觉这个返回将永远无法实现,因为Firebase文档/视频解释了响应。send()…
向平台表明云函数已经完成。获得Doug Stevenson或Puf的反馈会很有意思。还要注意的是,对于HTTP云函数,视频显示您不需要返回由get()
方法返回的初始承诺(虽然这是后台触发的云函数所必须的)。当我使用“firebase服务--仅限函数”时,这个答案对我来说很有效。但是,当我使用“firebase部署--仅限函数”或“firebase部署”时,我会遇到同样的错误。因此,我想,我的设置一定有问题吧?
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);
})
});
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);
})
});