Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我会得到;预期的catch()或return-尝试通过云功能连接firestore时出错?_Javascript_Node.js_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Javascript 为什么我会得到;预期的catch()或return-尝试通过云功能连接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

我使用google cloud firestore收集一定数量的数据。 我正在尝试编写一个googlecloud函数,根据http请求返回firestore中的集合数

因此,我编写了以下
index.js
-文件绘图:

部署后,出现以下错误:

奇怪的是:当我删除行var
db=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);
    })
});