【问题标题】:Returning empty result from equalTo in Firebase Cloud Function在 Firebase Cloud Function 中从 equalTo 返回空结果
【发布时间】:2018-09-27 09:15:40
【问题描述】:

当我的数据库没有任何equalTo() 匹配结果时,我需要处理这种情况。目前,如果我有匹配的项目,下面的代码只会返回,如果没有匹配项,它根本不会返回。请告知如何处理?

function getActivitySurvey(pin) {
   return new Promise((resolve, reject) => {
     var ref = admin.database().ref("activity-survey");
     ref.orderByChild("pin").equalTo(pin.toString()).once('child_added')
       .then((snapshot) => {
          if (snapshot) {
             resolve(snapshot);
          } else {
             reject(new Error('No ActivitySurvey'));
          }
      }).catch( () => {
        reject(new Error('No snapshot'));
      })
   })
}

编辑: 我已经将代码修改为如下所示,如果指定了数据库中不存在的 pin 值,则输出到控制台的唯一行是“getActivitySurvey”,该函数最终超时但永远不会返回:

function getActivitySurvey(pin) {
return new Promise((resolve, reject) => {
  console.log('getActivitySurvey')
  var ref = admin.database().ref("activity-survey");
  ref.orderByChild("pin").equalTo(pin.toString()).once('child_added').then((snapshot) => {
      console.log('have snapshot')
      if (snapshot.exists()) {
        resolve(snapshot);
      } else {
        console.log('Rejecting ActivitySurvey')
        reject('error');
      }
    }).catch( (err) => {
      console.log('Caught error')
      reject('err');
    })
})
}

【问题讨论】:

  • 您的意思是要查询pin为空(或不存在)的记录?
  • 记录不存在——因此与 db 中的非空引脚不匹配。

标签: javascript firebase firebase-realtime-database firebase-admin


【解决方案1】:

您无法仅使用child_added 侦听器来检测孩子是否存在。为此,您需要使用 value 侦听器。

例如:

ref.orderByChild("pin").equalTo(pin.toString())
   .once('child_added')
   .then((snapshot) => {
      resolve(snapshot);
   });
ref.orderByChild("pin").equalTo(pin.toString()).limitToFirst(1)
   .once('value')
   .then((snapshot) => {
      if (!snapshot.exists()) {
         reject(new Error('No ActivitySurvey'));
      }
   });

或者只有一个查询:

ref.orderByChild("pin").equalTo(pin.toString()).limitToFirst(1)
   .once('value')
   .then((snapshot) => {
      if (snapshot.exists()) {
         snapshot.forEach(function(child) { // will loop only once, since we use limitToFirst(1)
            resolve(child);
         });
      }
      else {
         reject(new Error('No ActivitySurvey'));
      }
   });

【讨论】:

  • 很好,弗兰克,它适用于value,但不适用于child_added!
  • 是的!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 2017-10-21
  • 2019-05-23
  • 2018-10-16
  • 1970-01-01
  • 2019-10-13
  • 2019-07-03
相关资源
最近更新 更多