NODEJS,GRAPHQL,SUBSCRIBE收到了多次而不是一次

时间:2018-10-15 13:47:53

标签: node.js graphql subscribe

因此,基本上,我有一个应用程序,当我收到短信时,后端使用graphql捕获它,然后发布事件总线,所有订阅该事件总线的通道都会实时接收到通知到前端显示屏。

我的问题是,我的后端仅发布一次通知,但是我的前端收到通知的频率更高,如指数级。例如,发布的第一个通知会被捕获一次。第二个发布捕获2,然后捕获4 8等等...

我相信原因是订阅方法前端会重新执行事件总线中的所有事件,并真的经常执行同一事件。

这是一些代码示例:

Event published only once, for each new notifications Received multiple event

这是发布事件的代码:它将通知添加到我的数据库中,并发布事件以通知浏览器进行更新。

function addNotification( from, to, body , date){
    //retrieve the last notifications received from this number to this number and crush it with this new notification
    let database = firebase.firestore();
    database.collection('notifications').where('from','==',from).where('to','==',to).get()
    .then(function (querySnapshot) {   
        if(querySnapshot.empty) {
            console.log('publish')
            let data = { from:from, to:to, body:body, date:date } 

             database.collection('notifications').doc().set(data)
             pubsub.publish(NOTIFICATIONS_ADDED, { notificationAdded: {from:from,to:to,body:body,date:date}});
        } else {
            querySnapshot.forEach(function (doc) {  
                var data = {
                    body:body,
                    date:date
                }
                console.log('publish')
                database.collection("notifications").doc(doc.id).set(data, { merge: true }); 
                pubsub.publish(NOTIFICATIONS_ADDED, { notificationAdded: {from:from,to:to,body:body,date:date}});
            });
        }
      }).catch(err => {
        console.log(err)
        throw Error(err.toString());
      })
  }

这是预订getNewNotificationSubscription的代码前端

 _subscribeToMoreNotifications = subscribeToMore  => {
    subscribeToMore({
      document: getNewNotificationsSubscription,
      updateQuery: (prev, { subscriptionData }) => {
        console.log('received')
        if (!subscriptionData.data) return prev
        if (!subscriptionData.data.notificationAdded) return prev
        const newNotifications = subscriptionData.data.notificationAdded
        return  Object.assign({}, prev, {
          getSMSNotifications: [ newNotifications, ...prev.getSMSNotifications ]
        })
      }
    })
  }

我猜想,一种锻炼方式是检查最后收到的数据是否与以前收到的数据相同,但是并不能解决我多次收到相同数据的问题。

此外,在我的后端打印屏幕上,我们可以看到 MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个NOTIFICATIONS_ADDED侦听器。使用Emitter.setMaxListeners()增加限制发布,这看起来不太好。但是,我只有一个监听notifications_added的侦听器。

知道发生了什么吗?

0 个答案:

没有答案