尝试通过云函数连接到Firestore时,为什么会出现“ Expected catch()or return”错误?

时间:2019-03-28 10:25:44

标签: node.js firebase promise google-cloud-firestore google-cloud-functions

我将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});
        })
    }); 

部署后,出现此错误:

enter image description here

奇怪的是:当我删除var db = admin.firestore();行时,我得到了同样的错误。因此,我怀疑我根本无法正确连接到Firestore。

我在做什么错了?

3 个答案:

答案 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()