为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

绝地无双 2022-05-26 17:45:13
我正在制作一个网页,但是当输入相同的 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!");         }     }); }如果您能告诉我哪里有错误,或者最好的解决方案,我将不胜感激
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您的代码存在一些问题:

  1. 您正在使用 构建路径phone/${Imei}/imei,但您的变量名是拼写的imei(而不是Imei)。与大多数编程语言一样,JavaScript 中的大小写很重要,因此我建议密切注意拼写和大小写。

  2. 你没有validate()在任何地方打电话,这意味着你的支票没有运行。

  3. 你没有从validate(). 而且由于您要返回的内容来自异步调用中的数据库,因此您只能使用 promise 或async/来返回它await。这个 aslome 可以保证自己的答案,所以我建议你研究Firebase,异步检索数据如何使用函数中的 async-await 从异步函数返回值?以及如何从异步回调函数返回值?

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

    });

}


查看完整回答
反对 回复 2022-05-26
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号