node.js - redis 事件处理函数正在丢失类引用
问题描述
在我的 NODEJS 应用程序中,我订阅了不同的 redis 事件。对于所有事件,我想调用我的路由器,它具有根据事件性质路由请求的逻辑。正如您在我的redis.js
文件中看到的,我正在注册一个函数来接收这些事件。
redisSubscriber.on('pmessage', test.route) <-- Function is an instance of class Test
我正在使用node-redis
. 当 node-redis 调用我的route()
方法时,它失去了它的对象引用,即它无法访问this
. 为了说明这一点,我试图this.message
从route()
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
as redis 回调函数上使用包装器函数使用全局范围,并且this
在回调中不可用。
替换这个
redisSubscriber.on('pmessage', test.route)
和
redisSubscriber.on('pmessage',(pattern, channel, message) => {
test.route(pattern, channel, message);
})
推荐阅读
- javascript - ReactJS:错误:超过最大更新深度
- python - 无法使用 Django-cron 进行函数调用
- excel - Excel 创建新工作簿并复制现有工作簿表
- reactjs - 当访问正确的 url 并且用户未登录时,如何使我的 React 组件挂载?
- linux - 共享库符号冲突和静态链接(在 Linux 上)
- python - 不明白 x != " " 的用法
- python - 使用 PyInstaller 在 MSYS2/MinGW 中编译 GTK 软件的问题
- javascript - 选择子单选按钮时选择容器,未选中时 div 内的链接除外
- c# - 从 2.1 迁移到 3.1 .Net Core,Microsoft.AspNetCore.App 的替代品是什么?
- java - Java While 循环额外条件