Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript firebase在一个位置返回未定义的用户id,在另一个位置返回正确的值_Javascript_Firebase_Google Cloud Firestore_Firebase Authentication - Fatal编程技术网

Javascript firebase在一个位置返回未定义的用户id,在另一个位置返回正确的值

Javascript firebase在一个位置返回未定义的用户id,在另一个位置返回正确的值,javascript,firebase,google-cloud-firestore,firebase-authentication,Javascript,Firebase,Google Cloud Firestore,Firebase Authentication,我使用以下函数获取用户id: currentUser.js import firebase from './firebase'; export default function getCurrentUserID() { var user = firebase.auth().currentUser; var uid; if (user != null) { uid = user.uid; // The user's ID, unique to the Firebase p

我使用以下函数获取用户id:

currentUser.js

import firebase from './firebase';

export default function getCurrentUserID() {
  var user = firebase.auth().currentUser;
  var uid; 
  if (user != null) {
    uid = user.uid;  // The user's ID, unique to the Firebase project. Do NOT use
    // this value to authenticate with your backend server, if
    // you have one. Use User.getToken() instead.
    return uid;
  }
  return uid;
}
import getCurrentUserID from './currentUserID';
import getFirestoreDB from './firestoreDB';
import Project from './project';
const addProjectBtn = document.getElementById('addProjectBtn');
function addProject() {
    const title = prompt('Insert title');
    const description = prompt('Insert Description');
    const project = new Project(title, description);
    const db = getFirestoreDB();
    const currentUserUID = getCurrentUserID();
    alert(currentUserUID); 
    db.doc(`users/${currentUserUID}/projects/${title}`).set({ ...project }).then(() => {
        alert("Success");
    }).catch((error) => {
        alert("Error " + error);
    });
}

export default function enableAddProjectBtnFunctionality() {
    addProjectBtn.addEventListener('click', addProject);
}
import getCurrentUserID from "./currentUserID";
import getFirestoreDB from './firestoreDB';

var db = getFirestoreDB(); 

export default function displayProjects(){
    var uid = getCurrentUserID(); 
    if(uid){
        alert(uid); 
        var projectsRef = db.collection("users").doc(`${uid}`).collection("projects"); 
        projectsRef.get().then((querySnapshot) => {           
                querySnapshot.forEach((doc) => {
                    // doc.data() is never undefined for query doc snapshots
                    console.log(doc.id, " => ", doc.data());
                });
            });  
    }
          
}
以下代码可以使用按钮添加项目,效果良好:

addProject.js

import firebase from './firebase';

export default function getCurrentUserID() {
  var user = firebase.auth().currentUser;
  var uid; 
  if (user != null) {
    uid = user.uid;  // The user's ID, unique to the Firebase project. Do NOT use
    // this value to authenticate with your backend server, if
    // you have one. Use User.getToken() instead.
    return uid;
  }
  return uid;
}
import getCurrentUserID from './currentUserID';
import getFirestoreDB from './firestoreDB';
import Project from './project';
const addProjectBtn = document.getElementById('addProjectBtn');
function addProject() {
    const title = prompt('Insert title');
    const description = prompt('Insert Description');
    const project = new Project(title, description);
    const db = getFirestoreDB();
    const currentUserUID = getCurrentUserID();
    alert(currentUserUID); 
    db.doc(`users/${currentUserUID}/projects/${title}`).set({ ...project }).then(() => {
        alert("Success");
    }).catch((error) => {
        alert("Error " + error);
    });
}

export default function enableAddProjectBtnFunctionality() {
    addProjectBtn.addEventListener('click', addProject);
}
import getCurrentUserID from "./currentUserID";
import getFirestoreDB from './firestoreDB';

var db = getFirestoreDB(); 

export default function displayProjects(){
    var uid = getCurrentUserID(); 
    if(uid){
        alert(uid); 
        var projectsRef = db.collection("users").doc(`${uid}`).collection("projects"); 
        projectsRef.get().then((querySnapshot) => {           
                querySnapshot.forEach((doc) => {
                    // doc.data() is never undefined for query doc snapshots
                    console.log(doc.id, " => ", doc.data());
                });
            });  
    }
          
}
但是,下面显示项目的代码不起作用。警报(uid)在此显示未定义,但上面显示了正确的用户id

displayProjects.js

import firebase from './firebase';

export default function getCurrentUserID() {
  var user = firebase.auth().currentUser;
  var uid; 
  if (user != null) {
    uid = user.uid;  // The user's ID, unique to the Firebase project. Do NOT use
    // this value to authenticate with your backend server, if
    // you have one. Use User.getToken() instead.
    return uid;
  }
  return uid;
}
import getCurrentUserID from './currentUserID';
import getFirestoreDB from './firestoreDB';
import Project from './project';
const addProjectBtn = document.getElementById('addProjectBtn');
function addProject() {
    const title = prompt('Insert title');
    const description = prompt('Insert Description');
    const project = new Project(title, description);
    const db = getFirestoreDB();
    const currentUserUID = getCurrentUserID();
    alert(currentUserUID); 
    db.doc(`users/${currentUserUID}/projects/${title}`).set({ ...project }).then(() => {
        alert("Success");
    }).catch((error) => {
        alert("Error " + error);
    });
}

export default function enableAddProjectBtnFunctionality() {
    addProjectBtn.addEventListener('click', addProject);
}
import getCurrentUserID from "./currentUserID";
import getFirestoreDB from './firestoreDB';

var db = getFirestoreDB(); 

export default function displayProjects(){
    var uid = getCurrentUserID(); 
    if(uid){
        alert(uid); 
        var projectsRef = db.collection("users").doc(`${uid}`).collection("projects"); 
        projectsRef.get().then((querySnapshot) => {           
                querySnapshot.forEach((doc) => {
                    // doc.data() is never undefined for query doc snapshots
                    console.log(doc.id, " => ", doc.data());
                });
            });  
    }
          
}

有人能帮我找出问题所在以及如何解决吗?

很可能是在用户登录完成之前执行了
displayProjects
方法

在这种情况下,获取用户状态的正确方法是使用身份验证状态侦听器,如上的文档中的第一个代码片段所示

在您的代码中,如下所示:

export default function displayProjects(){
  firebase.auth().onAuthStateChanged(function(user) {
    if (user) {
      var uid = user.uid;
      var projectsRef = db.collection("users").doc(`${uid}`).collection("projects"); 
      projectsRef.get().then((querySnapshot) => {           
        querySnapshot.forEach((doc) => {
          console.log(doc.id, " => ", doc.data());
        });
      });  
    }
  });
}

我刚刚阅读了一个与此类似的问题,因为我当前遇到了一个问题。currentUser:-这是否相关?它描述了相同的行为,解决方案与我在回答中显示的相同:使用身份验证状态侦听器。一旦您尝试了我的答案中的方法,请告诉我。啊,我正在测试。currentUser作为已加载的组件,但onAuthStateChanged没有跟上。似乎.currentUser可能有点不一致。我将实现上述功能。谢谢。这不是太不一致,因为恢复用户的身份验证状态需要一些时间。访问
currentUser
是一个同步操作,这意味着它可能在设置
currentUser
之前发生。使用身份验证状态侦听器可以避免该问题。如果我的答案有用,请单击向上投票按钮(▲) 如果它回答了您的问题,请单击复选标记(✓) 接受它。这样其他人知道你得到了(足够)的帮助。另外,我只调用了一次displayProjects(),那么它如何跟踪AuthState的更改?嘿,M代码。你有什么进展吗?你有没有机会阅读下面的我的答案并在代码中尝试它?如果我的答案有用,请单击“向上投票”按钮(▲) 如果它回答了您的问题,请单击复选标记(✓) 接受它。这样别人就会知道你已经得到了(足够的)帮助。也请参见