Возвращение пустого результата из equalTo в Firebase Cloud Function - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно обработать случай, когда моя база данных не имеет каких-либо подходящих результатов для 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'));
      })
   })
}

Редактировать: с тех пор я изменил код, чтобы он выглядел так, как показано ниже, в случае, если для значения пин-кода, которого нет в базе данных, указана единственная строка, которая получает вывод на консоль:'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');
    })
})
}

1 Ответ

0 голосов
/ 27 сентября 2018

Вы не можете определить, существует ли ребенок только с 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'));
      }
   });
...