FirebaseError: недействительная ссылка на документ. Ссылки на документы должны иметь четное количество сегментов. - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь ввести пользователя в свое приложение, используя его имя пользователя и пароль. Я читал о Create Custom Tokens и Authenticate with Firebase in JavaScript Using a Custom Authentication System, но все еще не понимал, как это реализовать, поэтому попробовал другой подход. Когда пользователь вводит свое имя пользователя, приложение будет искать в коллекции Firestore, если такое имя пользователя существует, и если это так, возьмите поле email для этого пользователя и перейдите к методу signInWithEmailAndPassword(email, password);. Я получаю указанную выше ошибку, потому что я не уважайте Cloud Firestore Data model где должна быть структура collection - document - collection - document.

Как мне действовать в таком случае?

Моя схема Firestore выглядит так

users
 - username1
     - userId
     - email
 - username2
     - userId
     - email

JavaScript код

app.post("/login", (req, res) => {
  const user = {
    username: req.body.username,
    password: req.body.password
  };
  ...

  let email;
  db.doc(`/users/${user.username}`).get()
  .then((doc) => {
    if (doc.exists) {
      email = db.doc(`/users/${user.username}/email`).get();
      firebase.auth().signInWithEmailAndPassword(email, user.password)
      .then((data) => {
        return data.user.getIdToken();
      }) 
      .then((token) => {
        return res.json({token});
      })
      ...

1 Ответ

2 голосов
/ 13 июля 2020

Ошибка «Ссылки на документы должны иметь четное количество сегментов» не имеет ничего общего с Firebase Authentication. Он сообщает вам, что ваш код для создания ссылки на документ неверен:

db.doc(`/users/${user.username}/email`)

Здесь ссылка на документ состоит из трех сегментов (нечетное число). Ссылки на документы должны иметь четное число.

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

if (doc.exists) {
  email = doc.data().email;

Я предлагаю просмотреть документацию о чтении документов из Магазин огня.

...