在我的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)
答案 0 :(得分:1)
尝试在this
上使用包装函数,因为redis回调函数使用全局范围,并且redisSubscriber.on('pmessage', test.route)
在回调中不可用。
替换此
redisSubscriber.on('pmessage',(pattern, channel, message) => {
test.route(pattern, channel, message);
})
与
{{1}}