Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Firebase函数-查询firestore_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Firebase函数-查询firestore

Firebase函数-查询firestore,firebase,google-cloud-firestore,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Functions,我试图在一个云函数中从firestore中检索一些数据,但什么也没有得到。客户端上的相同查询提供了正确的结果。可能是小问题,但我看不出有什么问题。我做错了什么 const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore(); db.settings({ timestampsInS

我试图在一个云函数中从firestore中检索一些数据,但什么也没有得到。客户端上的相同查询提供了正确的结果。可能是小问题,但我看不出有什么问题。我做错了什么

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
db.settings({ timestampsInSnapshots: true });

exports.myFunction = functions.https.onCall((data, context) => {
  const info = getInfo();
  //do some stuff with the info
  return info;
}

function getInfo() {
  const query = db
    .collection('info')
    .where('table_nr', '==', 1)
    .where('number', '<=', 25)
    .orderBy('number', 'desc')
    .limit(1);

  const info = query.get().then(snapshot => {
    snapshot.forEach(doc => {
      return doc.data();
    })
  })
  return info;
}
我尝试了很多不同的选择,比如当我将最后一部分更改为:

const info = query.get().then(snapshot => {
  snapshot.docs;
})
我得到一个包含1个对象的数组。因此,我确信查询中有一个包含数据的文档。console.log为我提供了:

{data: Array(1)}
data: Array(1)
0: {_ref: {…}, _fieldsProto: {…}, _serializer: {…}, _validator: {…}, 
_readTime: {…}, …}
length: 1
__proto__: Array(0)
__proto__: Object
以及:

console.log:

{data: {…}}
data:
  exists: true
  __proto__: Object
  __proto__: Object

我为查询创建了一个(工作)索引,这可能是一个好消息。

在这两种情况下,您都返回了一个对象的承诺,而该对象不是您真正想要发送给客户端的对象。当您编写一个callable时,您需要返回一个承诺,该承诺解析为您想要发送的确切JavaScript对象。你不能随便退货。您需要做的是将querySnapshot转换为简单的旧JavaScript对象,这些对象描述您希望客户端知道的内容。querySnapshot对象本身是不可序列化的-它是一个复杂的对象,描述了查询结果的许多方面

首先定义:您希望客户机接收什么?定义实际JavaScript对象的外观。现在,将查询结果转换为这样。您至少可以将整个文档集作为纯JS对象发送,如下所示:

return query.get().then(querySnapshot => {
    return querySnapshot.docs.map(doc => doc.data());
})

这将向客户端返回一个包含原始文档对象的数组。但我不清楚你想送什么(因为你没有定义你的期望)。但这只是一个开始。

你说的“我得到数据:空”是什么意思?您是否正在将日志添加到未在此处显示的函数中?你期望这个函数的最终结果是什么?在我看来,你可能没有正确地履行承诺。嗨,道格,谢谢你帮了我的忙!我从客户端这样调用这个云函数:let info=functions.httpscalable('myFunction')info()。然后(res=>{console.log(res)}),那么在函数中添加控制台日志时会发生什么?你真的在使用你期望的价值观吗?你需要调试它。我已经试过很多了。首先,我将getInfo()函数的最后一部分更改为:return query.get(),然后(querySnapshot=>{if(querySnapshot.empty){return{exists:false}}否则{return{exists:true,data:querySnapshot.data()}}返回:{data:{…}data:exists:true proto:Object proto:Object在注释中很难阅读。你能编辑这个问题来更详细地解释你在观察什么吗?你是我的英雄道格!!我在这里完全失明了。你救了我一天!
{data: {…}}
data:
  exists: true
  __proto__: Object
  __proto__: Object
return query.get().then(querySnapshot => {
    return querySnapshot.docs.map(doc => doc.data());
})