Javascript React和Firebase:将日期添加到数据库会导致侦听器触发两次?

Javascript React和Firebase:将日期添加到数据库会导致侦听器触发两次?,javascript,reactjs,firebase,firebase-realtime-database,Javascript,Reactjs,Firebase,Firebase Realtime Database,我有一个非常简单的聊天应用程序。提交后,它会使用用户名和消息更新数据库 this.ref.child("/chat").update({username: this.state.username, message: this.state.chatMessage}); 然后,我使用ref.on('value',())获取新的聊天记录并将其存储在数组中 this.chat.on('value',(snapshot) => { console.log('triggered')

我有一个非常简单的聊天应用程序。提交后,它会使用用户名和消息更新数据库

this.ref.child("/chat").update({username: this.state.username, 
    message: this.state.chatMessage});
然后,我使用ref.on('value',())获取新的聊天记录并将其存储在数组中

this.chat.on('value',(snapshot) => {
    console.log('triggered')
    let newMessage = {username:snapshot.val().username, message: snapshot.val().message}
    this.setState({chatArray: [...this.state.chatArray,newMessage]})
}) 
我试图想出一个解决方法来获取重复的消息(即再次键入相同的消息,因为如果没有任何更改,侦听器不会被触发),所以我想我应该向数据库添加一个日期对象。当我使用将日期添加到数据库时

let d = new Date();
this.ref.child("/chat").update({username: this.state.username, 
    message: this.state.chatMessage, time: d});
当我编写并提交某个内容时,事件侦听器开始被触发两次。提交聊天的用户将收到相同的消息两次,而另一个用户只收到一次。删除日期修复了问题

有人知道为什么会发生这种情况吗?

更改此选项:

this.chat.on('value',(snapshot) => {
为此:

this.chat.once('value').then((snapshot)=> {
这是一种只触发一次的方式,更多信息请参见:


Firebase数据库存储了JSON,并且
Date
不是有效的JSON类型。惯用的方法是存储时间戳:

this.ref.child("/chat").update({username: this.state.username, 
    message: this.state.chatMessage, time: Date.now()});
(value,()=>{})侦听器上的
被触发两次的原因是,它通过首先获取并返回当前值来操作,然后为随后的每个数据库条目更改而触发-如果您只想获取当前值,那么您可以使用@Peter Haddad描述的方法

值得注意的一点是,Firebase的担保人包括以下内容,如他们的:

值事件始终在最后触发,并保证包含 在创建快照之前发生的任何其他事件的更新 拿走了

这意味着,如果在调用更新数据库条目后调用
一次(value,()=>{})
,则可以保证已发生更新,并且侦听器中返回的数据包括更新