Firebase записи данных с переменной через REST - PullRequest
0 голосов
/ 08 марта 2020

в моем приложении я получаю uid текущего пользователя: также я получаю имя пользователя: console.log дает мне правильное имя. Но когда я пытаюсь записать в мою базу данных через: https://movieapp-8a157.firebaseio.com/users/${username}/${authUser}/posts.json?auth=${token} Это не работает. Если я удалю $ {username}, он напишет правильный путь. Любые идеи? Я отредактировал свой пост для большей ясности.

  export const postJob = data => {
  return async (dispatch, getState) => {
    const randomColors = ["#f3a683"];
    const colorNumber = Math.floor(Math.random() * 20) + 1;
    const bgColor = randomColors[colorNumber];

    const val = getState();
    const userId = val.auth.userId;

    const rules = {
      description: "required|min:2"
    };

    const messages = {
      required: field => `${field}  is required`,

      "description.min": "job description is too short"
    };

    try {
      await validateAll(data, rules, messages);

      const token = await firebase
        .auth()
        .currentUser.getIdToken(true)
        .then(function(idToken) {
          return idToken;
        });

      firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
          // User is signed in.
          var displayName = user.displayName;
          var email = user.email;
          var emailVerified = user.emailVerified;
          var photoURL = user.photoURL;
          var isAnonymous = user.isAnonymous;
          var uid = user.uid;
          var providerData = user.providerData;
          // ...
        } else {
          // User is signed out.
          // ...
        }
      });
      var user = firebase.auth().currentUser;

      const authUser = user.uid;
      const username = await firebase
        .database()
        .ref("users/" + authUser + "/name")
        .once("value", function(snapshot) {
          console.log("################", snapshot.val());
        });

      //console.log("#####################", authUser);
      const response = await fetch(
        `https://movieapp-8a157.firebaseio.com/users/${username}/${authUser}/posts.json?auth=${token}`,
        {
          method: "POST",
          headers: {
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
            titel: data.titel,
            fname: data.fname,
            description: data.description,
            cover: data.cover,
            friend: data.friend,
            ownerId: userId,

            bgColor: bgColor
          })
        }
      );

      const resData = await response.json();

1 Ответ

0 голосов
/ 08 марта 2020

Ваш код, который получает UID, работает не так, как вы ожидаете. Слушатель состояния аутентификации является асинхронным и запускает после строки кода, которая accessesfirebase.auth().currentUser. Эта строка кода фактически дает вам текущего пользователя до завершения входа. Это означает, что оно будет неопределенным.

Затем вы используете это неопределенное значение для создания ссылки на местоположение в базе данных. Это заставляет фактическую ссылку быть чем-то иным, чем вы ожидаете. Вы должны добавить журнал отладки, чтобы увидеть это сами.

Вы должны использовать обратный вызов, чтобы определить, когда именно пользователь вошел в систему, и только читать и записывать местоположение этого пользователя. Это означает, что вам, вероятно, следует переместить строки кода, которые записывают базу данных в обратный вызов, когда вы знаете, что user является правильным, и использовать user.uid для создания ссылки на базу данных для чтения и записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...