node.js - Redis 事件处理函数正在丢失类引用

标签 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。为了说明这一点,我尝试从 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);
})

关于node.js - Redis 事件处理函数正在丢失类引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50390882/

相关文章:

node.js - 如何使用Redis缓存进行分页?

node.js - 如何在node项目中使用babel编译的类?

docker - 使用 fluentd 监控 Redis

asp.net - 我们可以在同一个应用程序中将 session 状态和缓存存储在 Redis 缓存上吗?

python - 检索 redis 列表中由 ltrim 修剪的值

javascript - 无法让 socket.io-emitter 与 socket.io-redis 一起工作

javascript - Grunt Globbing 模式

javascript - NodeJs + Mysql 查询执行太晚(延迟)

jquery - Ajax Jquery PUT 请求不起作用

reactjs - 如何从 React 组件订阅 Redis channel