首页 > 解决方案 > redis 事件处理函数正在丢失类引用

问题描述

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

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

我正在使用node-redis. 当 node-redis 调用我的route()方法时,它失去了它的对象引用,即它无法访问this. 为了说明这一点,我试图this.messageroute()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)

标签: node.jsredisnode-redis

解决方案


尝试在您的test.routeas redis 回调函数上使用包装器函数使用全局范围,并且this在回调中不可用。

替换这个

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

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

推荐阅读