gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:15:20 25 4
gpt4 key购买 nike

在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com