繁体   English   中英

用户首次实时登录firebase数据库时如何创建用户特定数据?

[英]How to create user specific data when user logs in for the first time in realtime firebase database?

我希望代码能够在用户登录时创建特定数据,但如果 firebase 实时数据库中已经存在,则不会创建它。 我使用了以下代码,通过它检查孩子是否已经存在,如果没有,则在 firebase 数据库中创建孩子,但不知何故,代码的行为不正常。 当用户再次登录时,完整的数据部分将被重写。

片段我需要帮助

if (!(checkdata(user.uid))) {
            writeUserData(user.uid,user.displayName,user.email,user.photoURL)
        }
var database = firebase.database();

function checkdata(userid){
    var ref = firebase.database().ref("users");
ref.once("value")
  .then(function(snapshot) {
    var datapresent = snapshot.hasChild(userid); // true
    return datapresent
  });
}
function writeUserData(userId, name, email, imageUrl) {
    firebase.database().ref('users/' + userId).set({
      username: name,
      email: email,
      profile_picture : imageUrl,
      cropdata : []
      
    });
  }

完整的JS文件

const signInBtn = document.getElementById('signinbtn');
const signOutBtn = document.getElementById('signoutbtn');
const userDetails = document.getElementById('username');

const auth = firebase.auth();
const provider = new firebase.auth.GoogleAuthProvider();

signInBtn.onclick = () => auth.signInWithPopup(provider);

signOutBtn.onclick = () => auth.signOut();

function toggle(className, displayState){
    var elements = document.getElementsByClassName(className)

    for (var i = 0; i < elements.length; i++){
        elements[i].style.display = displayState;
    }
}

auth.onAuthStateChanged(function(user) {
    if (user) {
        // signed in
        toggle('userishere', 'block');
        toggle('usernothere', 'none');
        //userDetails.innerHTML = `<h3>Hello ${user.displayName}!</h3> <p>User ID: ${user.uid}</p>`;
        userDetails.innerHTML = `Hello ${user.displayName}!`
        console.log(user)
        if (!(checkdata(user.uid))) {
            writeUserData(user.uid,user.displayName,user.email,user.photoURL)
        }
    } else {
        // not signed in
        toggle('userishere', 'none');
        toggle('usernothere', 'block');
        userDetails.innerHTML = '';
    }
});


var database = firebase.database();

function checkdata(userid){
    var ref = firebase.database().ref("users");
ref.once("value")
  .then(function(snapshot) {
    var datapresent = snapshot.hasChild(userid); // true
    return datapresent
  });
}
function writeUserData(userId, name, email, imageUrl) {
    firebase.database().ref('users/' + userId).set({
      username: name,
      email: email,
      profile_picture : imageUrl,
      cropdata : []
      
    });
  }
 

我刚刚找到了解决方案,异步代码没有等待我的 firebase 响应,只是检查了 datapresent 是否为真,所以在 function 之前使用异步定义并在 ref.once(value) 之前等待,我的问题是解决。 下面的工作代码:

const signInBtn = document.getElementById('signinbtn');
const signOutBtn = document.getElementById('signoutbtn');
const userDetails = document.getElementById('username');
var database = firebase.database();
const auth = firebase.auth();
const provider = new firebase.auth.GoogleAuthProvider();



signInBtn.onclick =  () => auth.signInWithPopup(provider);

signOutBtn.onclick =  () => auth.signOut();

async function checkdata(user){
    let ref = firebase.database().ref("users");
    let snapshot = await ref.once('value');
    if (!snapshot.hasChild(user.uid)){
        console.log(user)
        writeUserData(user.uid,user.displayName,user.email,user.photoURL)
        console.log("write done")
    }
    else{
        console.log("did not write")
    }
}

function writeUserData(userId, name, email, imageUrl) {
    firebase.database().ref('users/' + userId).set({
        username: name,
        email: email,
        profile_picture: imageUrl,
        cropdata: []
    });
}


function toggle(className, displayState) {
    var elements = document.getElementsByClassName(className)

    for (var i = 0; i < elements.length; i++) {
        elements[i].style.display = displayState;
    }
}

auth.onAuthStateChanged(function (user) {
    if (user) {
        // signed in
        toggle('userishere', 'block');
        toggle('usernothere', 'none');
        //userDetails.innerHTML = `<h3>Hello ${user.displayName}!</h3> <p>User ID: ${user.uid}</p>`;
        userDetails.innerHTML = `Hello ${user.displayName}!`
        console.log(user)
        checkdata(user)
    }
    else {
        toggle('userishere', 'none');
        toggle('usernothere', 'block');
        userDetails.innerHTML = '';
    }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM