如何避免 Firebase / Cloud Firestore 中的重复数据

我正在制作一个网页,但是当输入相同的 ID 时应该会出现错误,但我无法做到。


 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!"); 

        } 

    }); 

}

如果您能告诉我哪里有错误,或者最好的解决方案,我将不胜感激


绝地无双
浏览 142回答 1
1回答

蓝山帝景

您的代码存在一些问题:您正在使用 构建路径phone/${Imei}/imei,但您的变量名是拼写的imei(而不是Imei)。与大多数编程语言一样,JavaScript 中的大小写很重要,因此我建议密切注意拼写和大小写。你没有validate()在任何地方打电话,这意味着你的支票没有运行。你没有从validate(). 而且由于您要返回的内容来自异步调用中的数据库,因此您只能使用 promise 或async/来返回它await。这个 aslome 可以保证自己的答案,所以我建议你研究Firebase,异步检索数据,如何使用函数中的 async-await 从异步函数返回值?以及如何从异步回调函数返回值?您确实应该使用事务来确保没有人可以在代码中的读写操作之间声明 IMEI。如果 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);    });}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript