Как я могу избежать дублирования данных в Firebase / Cloud Firestore - PullRequest
0 голосов
/ 21 марта 2020

Я делаю веб-страницу, но при вводе того же идентификатора должна появиться ошибка, но я не смог этого сделать.

 function save () {
    if (validate  = true) {
        console.log("exists!")
    }else {
        
    var imei = document.getElementById('imei').value;
    var marca = document.getElementById('marca').value;
    var referencia = document.getElementById('referencia').value;
    var precio = document.getElementById('precio').value;

    db.collection("phone").add({
        Imei: imei,
        Marca: marca,
        Referencia: referencia,
        Precio: precio
    })
        .then(function (docRef) {
            document.getElementById('imei').value = '';
            document.getElementById('marca').value = '';
            document.getElementById('referencia').value = '';
            document.getElementById('precio').value = '';
        })
        .catch(function (error) {
            window.alert("Error adding document: ", error);
        });
    }
}save();

function validate () {
    firebase.database().ref(`phone/${Imei}/imei`).once("value", snapshot => 
    { const imei = snapshot.val(); 
        if (imei){ 
            console.log("user exists!"); 
        } 
    }); 
}

Если вы можете сказать мне, где у меня есть ошибка, или лучшее решение, я был бы очень признателен

1 Ответ

1 голос
/ 22 марта 2020

Несколько проблем с вашим кодом:

  1. Вы строите путь с помощью phone/${Imei}/imei, но имя вашей переменной пишется imei (а не Imei). Дело в JavaScript, как и в большинстве языков программирования, поэтому я рекомендую обратить пристальное внимание на орфографию и дело.
  2. Вы нигде не звоните validate(), что означает, что ваша проверка не запускается .
  3. Вы ничего не возвращаете с validate(). А поскольку то, что вы хотите вернуть, поступает из базы данных при асинхронном вызове, вы можете вернуть его только с обещанием или async / await. Это может оправдать свой ответ, поэтому я рекомендую вам изучить Firebase, асинхронный поиск данных , Как вернуть значения из асин c функций, используя asyn c -aait из функции? и Как вернуть значение из функции асинхронного обратного вызова?
  4. Вы действительно должны использовать транзакцию, чтобы никто не мог требовать IMEI между операцией чтения и записи в вашем коде.
  5. Если значение IMEI должно быть уникальным, лучше использовать его как ключ , а не как значение свойства. Подробнее об этом здесь:

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

function save () {
    var imei = document.getElementById('imei').value;
    var marca = document.getElementById('marca').value;
    var referencia = document.getElementById('referencia').value;
    var precio = document.getElementById('precio').value;

    var imeiDocRef = db.collection("phone").doc(imei);

    db.runTransaction(function(transaction) {
        // This code may get re-run multiple times if there are conflicts.
        return transaction.get(imeiDocRef).then(function(imeiDoc) {
            if (imeiDoc.exists) {
                throw `IMEI '${imei}' already exist!`;
            }

            transaction.set(imeiDocRef, { 
                Imei: imei,
                Marca: marca,
                Referencia: referencia,
                Precio: precio
            });
        });
    }).then(function() {
        console.log("Transaction successfully committed!");
        document.getElementById('imei').value = '';
        document.getElementById('marca').value = '';
        document.getElementById('referencia').value = '';
        document.getElementById('precio').value = '';
    }).catch(function(error) {
        console.log("Transaction failed: ", error);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...