Search code examples
node.jsmongodbeventemitterchangestream

unable to remove listener from mongodb change stream 'change' event


I figured the mongodb change stream extends the EventEmitter class, so I tried removing events I installed by using the removeListener function. After calling removeListener on the change stream it still fired on change. May be I'm just using the wrong function reference when removing, but I can not see how.

I found out removeAllListeners does remove the attached listener. But I need to be in control what listener to remove.

const change_listener = (change) => {
    console.log(change_stream.listenerCount("change"))
    change_stream.removeListener("change", change_listener)
    console.log(change_stream.listenerCount("change"))
}
change_stream.on("change", change => change_listener(change))

should output 1 0

but it outputs 1 1

and the listener goes on listening.

Using .once instead of .on only helps half the way. I would still need removeListener because I need to be able to cancel the listener early.


Solution

  • The problem is due to the function you are removing.

    This should work:

    const change_listener = (change) => {
        console.log(change_stream.listenerCount("change"))
        change_stream.removeListener("change", change_listener)
        console.log(change_stream.listenerCount("change"))
    }
    change_stream.on("change", change_listener)
    

    Note that change => change_listener(change) is a function and it is different from change_listener