当尝试通过云功能连接到firestore时,为什么会出现“Expected catch()或return -error”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当尝试通过云功能连接到firestore时,为什么会出现“Expected catch()或return -error”?相关的知识,希望对你有一定的参考价值。

我使用谷歌云火库与一定数量的集合。我正在尝试编写一个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});
        })
    }); 

部署后,我收到此错误:

enter image description here

奇怪的是:当我删除行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

以上是关于当尝试通过云功能连接到firestore时,为什么会出现“Expected catch()或return -error”?的主要内容,如果未能解决你的问题,请参考以下文章

GCP 云功能无法连接到 GCP SQL 实例

通过 Firebase 访问 Firestore 超时(React Native 应用程序)

从 Terraform 云功能连接到 Enterprise GitHub

如何通过 Dialogflow 中的内联编辑器将 Dialogflow 连接到 Cloud Firestore?

当尝试使用 psycopg2 模块通过 python 连接到 redshift 时,会显示以下错误

通过云功能运行时在 Firestore 中出现问题