首页 > 解决方案 > Firebase 通过 REST 使用变量写入数据

问题描述

在我的应用程序中,我通过以下方式获取当前用户的 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();

标签: javascriptreactjsfirebasefirebase-realtime-databasefirebase-authentication

解决方案


您获取 UID 的代码没有按照您预期的方式工作。auth 状态监听器是异步的,并且accessesfirebase.auth().currentUser. 这行代码实际上是在登录完成之前为您提供当前用户。这意味着它将是未定义的。

然后,您将使用该未定义值来构建对数据库中某个位置的引用。这导致实际参考与您期望的不同。 您应该添加调试日志以自己查看。

您应该使用回调来确定用户何时登录,并且只读取和写入该用户的位置。这意味着您可能应该将写入数据库的代码行移动到回调中,当您知道这user是正确的时,并使用它user.uid来构建用于读取和写入的数据库引用。


推荐阅读