Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在实时数据库中插入项的奇怪行为_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript 在实时数据库中插入项的奇怪行为

Javascript 在实时数据库中插入项的奇怪行为,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我在一个简单的网页中有以下代码;它将页面连接到firebase实时数据库,以允许用户向数据库添加项目 它按预期工作,防止具有相同URL的项目重复 但它的行为很奇怪,因为即使输入了一个新项目而没有重复,该URL的警报也已经注册。仍然会弹出。就好像在将项写入数据库后额外调用了函数一样 有人能看到并解释为什么会发生这种情况吗 <form id='adTF'> Name: <input id='name' type='text' maxlength=128 size=50 valu

我在一个简单的网页中有以下代码;它将页面连接到firebase实时数据库,以允许用户向数据库添加项目

它按预期工作,防止具有相同URL的项目重复

但它的行为很奇怪,因为即使输入了一个新项目而没有重复,该URL的警报也已经注册。仍然会弹出。就好像在将项写入数据库后额外调用了函数一样

有人能看到并解释为什么会发生这种情况吗

<form id='adTF'>
  Name: <input id='name' type='text' maxlength=128 size=50 value='' required>
  <br/><br/>
  URL: <input id='url' type='text' maxlength=128 size=50 value='' required>
  <br/><br/>
  <input type='submit' value='Submit'>
</form>

<script>
  document.getElementById('adTF').addEventListener('submit',addItem)

  var dbReference = firebase.database().ref('ItemList');

  function addItem(event) {
    console.log('Entering addItem');
    event.preventDefault();

    const url = document.getElementById('url').value.trim(),
          name = document.getElementById('name').value.trim();

    dbReference.orderByChild("url").equalTo(url).on("value", function(snapshot) {
      if (snapshot.exists()) {
        alert('This URL has already been registered.')
      } else {
        // The URL is not in the DB, we insert it.
        let newItem = dbReference.push();
        newItem.set({url:url,name:name});
        document.getElementById('url').value = '';
        document.getElementById('name').value = '';
      }
    });
  } /* End of addItem */
</script>
附言


通过将跟踪消息放在addItem函数中,我可以理解函数本身不会被调用两次,但它只是snapshot.exists,会运行两次。

以防其他人碰巧遇到同样的问题。以下是解决方案:

代码行:

dbReference.orderByChild("url").equalTo(url).on("value", function(snapshot) {
必须更改为:

dbReference.orderByChild("url").equalTo(url).once("value", function(snapshot) {

毕竟,知道前进的道路是可行的,这并不奇怪。插入一个项目后,数据库再次被拉入,表示找到了该项目。

您是否尝试了类似console.logsnapshot.exists的操作?这也应该显示函数是否被多次调用。是的,当插入一个项时,它确实被调用了两次。为什么调用了两次?回调调用了两次吗?或者addItem调用了两次?我只能猜测,但如果是回调,插入可能会触发第二个值事件?我不明白这个问题,对我来说,addItem就是回调。那么你说的回调是什么意思?在任何情况下,我都知道在将项插入数据库时会调用snapshot.exists两次。我对这篇文章做了一次编辑,希望它能让事情变得更清楚。