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);
})
在我的 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);
})