Javascript 在实时数据库中插入项的奇怪行为
我在一个简单的网页中有以下代码;它将页面连接到firebase实时数据库,以允许用户向数据库添加项目 它按预期工作,防止具有相同URL的项目重复 但它的行为很奇怪,因为即使输入了一个新项目而没有重复,该URL的警报也已经注册。仍然会弹出。就好像在将项写入数据库后额外调用了函数一样 有人能看到并解释为什么会发生这种情况吗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
<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两次。我对这篇文章做了一次编辑,希望它能让事情变得更清楚。