Как я могу повторить запрос Firestore, пока не будет выполнено условие? - PullRequest
1 голос
/ 25 июня 2019

Поэтому я работаю над хранением информации о пользователях в моей базе данных, и в дополнение к стандартным данным, которые я получаю от пользователя Firebase, я хотел добавить свои собственные пользовательские данные. Я настраиваю страницу профиля для каждого из моих пользователей, и я хотел создать случайное 10-значное число, которое будет их ID профиля. Затем я сохраняю его в своей базе данных на тот случай, если мне это нужно. Тем не менее, мне нужно, чтобы они были уникальными числами и чтобы они не повторялись, поэтому я пытаюсь выполнить запрос к базе данных, чтобы проверить, используется ли сгенерированный мной профиль ID, и если да, сгенерировать еще один. Тем не менее, я не могу понять, как повторить запрос в Firestore, кроме, может быть, с использованием цикла, но не похоже, что он будет работать.

    const usersRef: AngularFirestoreCollection = this.afs.collection('users');

    var query = usersRef.ref.where("profileID", '==', profileID);
    query.get().then((querySnapshot) => {
      if (!querySnapshot.empty) {
        profileID = this.getRandomProfileID();
      }
    })

1 Ответ

1 голос
/ 25 июня 2019

Рекурсивная функция, подобная этой, кажется подходящей:

function getRandomProfileID() {
  return new Promise(function(resolve, reject) {
    var profileID = .... 

    var query = usersRef.ref.where("profileID", '==', profileID);
    query.get().then((querySnapshot) => {
      if (!querySnapshot.empty) {
        this.getRandomProfileID();
      }
      else {
        resolve(profileID);
      }
    })
  })
}

И затем вы вызываете ее с помощью:

getRandomProfileID().then(function(profileID) {
  console.log(profileID);
});

Или если вы используете более современнуюверсия JavaScript:

var profileID = await getRandomProfileID();
console.log(profileID);

Как указал Дуг, с async / await вы можете даже полностью обойтись без рекурсивной функции:

while (true) {
    let profileID = .... 
    let snapshot = await usersRef.ref.where("profileID", '==', profileID).get()
    if (!snapshot.empty) {
        break;
    }
}
console.log("Found unique ID: " + profileID);

Но есть некоторые вещиеще нужно рассмотреть с этим подходом:

  1. Другой пользователь может генерировать тот же идентификатор профиля между временем, когда вы генерируете и проверяете его, и фактически создаете его.Если это вызывает озабоченность, вам, вероятно, следует использовать транзакцию для вышеуказанной функции и создать документ профиля.Если это не является реальной проблемой, вы все равно должны убедиться в правилах безопасности, что ни один пользователь не может перезаписать документ, который уже был создан другим пользователем.

  2. Если вы собираетесь использовать свойСобственный идентификатор профиля во многих местах для идентификации пользователя, рассмотрите возможность создания дополнительной коллекции, где каждое имя / идентификатор документа является идентификатором профиля, а содержимое документа является ключом к коллекции пользователей.Если вы собираетесь однозначно идентифицировать пользователей по их идентификатору профиля, рассмотрите возможность использования идентификатора профиля в качестве ключа их документа в коллекции пользователей вместо любого используемого вами ключа.

...