redis事件处理函数正在丢失类引用

时间:2018-05-17 11:57:30

标签: node.js redis node-redis

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

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

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

文件 - 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)

1 个答案:

答案 0 :(得分:1)

尝试在this上使用包装函数,因为redis回调函数使用全局范围,并且redisSubscriber.on('pmessage', test.route) 在回调中不可用。

替换此

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

{{1}}