Redis 事件处理函数正在丢失 class 引用

redis event handler function is losing class reference

在我的 NODEJS 应用程序中,我订阅了不同的 redis 事件。 对于所有事件,我想调用我的路由器,它具有根据事件的性质路由请求的逻辑。正如您在我的 redis.js 文件中看到的那样,我正在注册一个函数来接收这些事件。

redisSubscriber.on('pmessage', test.route) <-- Function is an instance of class Test

我正在使用 node-redis。当 node-redis 调用我的 route() 方法时,它正在丢失其对象引用,即它无法访问 this。为了说明这一点,我试图从 route() 方法访问 this.message ,该方法已被 node-redis 在接收事件时调用。

文件 - test.js

class Test {
  constructor () {
    this.message = 'hello'
  }

  route (pattern, channel, message) {
    console.log(this.message) // Output: undefined
    console.log(pattern + ' ' + channel + ' ' + message) // Output: __keyevent@*__:set __keyevent@0__:set key
  }
}

module.exports = Test

文件 - redis.js

const Redis = require('redis')

let redis = Redis.createClient({
  host: 'localhost',
  port: 6379
})
let redisSubscriber = redis.duplicate()

let Test = require('./test')
let test = new Test()

redisSubscriber.on('pmessage', test.route)
redisSubscriber.psubscribe('__keyevent@*__:set')
redisSubscriber.psubscribe('__keyevent@*__:del')
redisSubscriber.psubscribe('__keyevent@*__:expired')

// Allow redis-subscriber to subscribe to all events.
setTimeout(function () {
  // When I set this key, a set event is generated.
  redis.set('key', 'value', function (error) {
    if (error) throw error

    // Allow set event to propagate, then quit redis.
    setTimeout(function () {
      redisSubscriber.unsubscribe()
      redisSubscriber.quit()
      redis.quit()
    }, 100)
  })
}, 100)

尝试在 test.route 上使用包装函数,因为 redis 回调函数使用全局范围,this 将无法在回调中使用。

替换这个

redisSubscriber.on('pmessage', test.route)

redisSubscriber.on('pmessage',(pattern, channel, message) => {
   test.route(pattern, channel, message);
})