Firebase не добавляет документы после массового создания пользователя - PullRequest
2 голосов
/ 25 марта 2020

Фон

Я пытаюсь заполнить свой Firebase списком первоначальных пользователей в веб-приложении. Это должен быть двухэтапный процесс:

  • Добавление пользователя в Firebase Auth с использованием метода createUserWithEmailAndPassword().
  • Добавление пользователя в коллекцию Firestore с использованием collection.add() метод.

Код

// Initialize Firebase:

var db = firebase.initializeApp(config).firestore();

// Function to add a new user:

function add(email) {
  firebase.auth().createUserWithEmailAndPassword(email, 'password')
    .then(function (user) {
      console.log('User created:', email, user.user.uid);
      return db.collection('users').add({
        email: email,
        uid: user.user.uid
      });
    })
    .then(function () {
      console.log('Document created:', email);
    })
    .catch(function (error) {
      console.error('Could not create user/document:', error);
    });
}

// Seed database with random users:

for (var i = 0; i < 10; ++i) {
  add(i + '@foo.bar');
}

Задача

Код из предыдущего раздела не работает. Я ожидаю, что он должен создать 10 пользователей и добавить 10 соответствующих документов в базу данных в случае успеха. Однако добавляет только часть документов (1-3) в базу данных , даже если пользователи созданы правильно.

Идеи

У меня возникли некоторые идеи Возможные причины, по которым этот код не работает:

  • Метод createUserWithEmailAndPassword() не только создает нового пользователя, но и выполняет автоматический c вход в систему . Возможно, это может привести к некоторому состоянию гонки.
  • Метод createUserWithEmailAndPassword() возвращает обещание с объектом UserCredential недавно зарегистрированного пользователя (я полагаю). Однако я могу ошибаться, и этот объект представляет собой пользователя , вошедшего в систему , что может быть причиной состояния гонки из предыдущего пункта.
  • Возможно, я использую обещает неправильно, потому что ни второй then(), ни catch() не называются.

1 Ответ

2 голосов
/ 28 марта 2020

Вот выдержка из ответа службы поддержки Firebase:

Каждый раз, когда новый пользователь создается с Auth, он устанавливает вновь созданного пользователя в качестве текущего пользователя приложения. Всякий раз, когда Firestore обнаруживает, что произошла смена пользователя, он закрывает все ожидающие потоки и отменяет любые запросы в полете.

Это полностью имеет смысл и объясняет поведение.

...