как остановить дублирование в базе данных firebase

#javascript #firebase #firebase-realtime-database

#javascript #firebase #firebase-realtime-database

Вопрос:

Я хочу пройти аутентификацию в своем приложении для чата, поэтому, когда пользователь регистрируется один раз, данные будут вставляться в базу данных firbase, но когда пользователь просто обновляет свой chrome, снова добавляются одни и те же данные, поэтому я хочу остановить дублирование, если пользователь уже вставлен, поэтому я попробовал этот код, упомянутый ниже, но это не работает.

 function onStateChanged(user) {
    if (user) {
        //alert(firebase.auth().currentUser.email   'n'   firebase.auth().currentUser.displayName);

        var userProfile = { email: '', name: '', photoURL: '' };
        userProfile.email = firebase.auth().currentUser.email;
        userProfile.name = firebase.auth().currentUser.displayName;
        userProfile.photoURL = firebase.auth().currentUser.photoURL;

        var db = firebase.database().ref('users');
        var flag = false;
        db.on('value', function (users) {
            users.forEach(function (data) {
                var user = data.val();
                if (user.email === userProfile.email) {
                    flag = true;
                }
            });

            if (flag === false) {
                firebase.database().ref('users').push(userProfile, callback);
            }
            else {
                document.getElementById('imgProfile').src = firebase.auth().currentUser.photoURL;
                console.log('elsepart')
                document.getElementById('imgProfile').title = firebase.auth().currentUser.displayName;

                document.getElementById('lnkSignIn').style = 'display:none';
                document.getElementById('lnkSignOut').style = '';
            }
        });
        
    }
    else{
        document.getElementById('imgProfile').src = image/profile-image.png;
        document.getElementById('imgProfile').title = '';

        document.getElementById('linkSignIn').style = '';
        document.getElementById('linkSignOut').style = 'display: none';
    }
}

let callback = (error)=>{
    if(error){
        alert(error)
    }
    else{
        document.getElementById('imgProfile').src = firebase.auth().currentUser.photoURL;
        document.getElementById('imgProfile').title = firebase.auth().currentUser.displayName;

        document.getElementById('linkSignIn').style = 'display: none';
        document.getElementById('linkSignOut').style = '';
    }
}

///////////

onFirebaseStateChanged();
  

Комментарии:

1. Почему вы хотите снова хранить информацию о пользователе в отдельной таблице. Возможно, вы захотите вызвать admin.auth().ListUsers на стороне сервера и создать api для доступа к нему на стороне клиента.

2. на самом деле я создаю приложение для чата с аутентификацией Google, поэтому, когда пользователь входит в систему один раз, я получаю такие данные, как имя, адрес электронной почты, photoURL и сохраняю их в базе данных, но когда пользователь снова обновляет страницу, те же данные снова сохраняются в другой таблице.

Ответ №1:

для этого вы можете попробовать функции чтения и записи firebase, для справки: ссылка

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

 firebase.database().ref('/login/'   username).once('value').then(function (snapshot) {
       if (snapshot.val() === null || snapshot.val() === undefined) {
           firebase.database().ref('login/'   username).set({
               name: name,
               email: username,
               password: password
           });
           _this.setState({
               showAlert: true,
               alertMessage: "User has been successfully register. Please login",
               alertType: 'success'
           })
       } else {
           console.log("in true")
           _this.setState({
               showAlert: true,
               alertMessage: "User already exist",
               alertType: 'warning'
           })
       }

  

Кроме того, для сохранения того же состояния входа в систему даже после обновления создание хранилища сеансов кажется мне простым решением.