如何解决添加到 Bull 队列后,对象不再是 Class 的实例
在我的 Fastify 路线的 handler
中,我将一个类的对象添加到我的 Bull 队列中。在队列的进程方法中,这个对象不再是类的实例。这是正常的还是我错过了一些(或很多)基础知识?
const fastify = require('fastify')({ logger: true })
const Queue = require('bull');
let addQueue = new Queue('Add','redis://127.0.0.1:6379');
...
addQueue.process(function(job,done){
console.log(job.data.dataObj instanceof ClasssDefinedSomwhereElse);
}
...
fastify.route({
method: 'POST',url: '/',...
handler: async (request,reply) => {
if(isFirstRequest) {
classObj = new ClasssDefinedSomwhereElse();
isFirstRequest = false;
} else {
console.log(classObj instanceof ClasssDefinedSomwhereElse);
addQueue.add({dataObj: classObj});
}
addQueue.add({dataObj: classObj});
或 addQueue.add(classObj);
没有区别。
handler
打印 true
,process
方法打印 false
。这是为什么?
我最终想要做的是,在 process
方法中,使用我刚刚传入的对象调用类的方法。我不是来自 Javascript 背景,所以我认为我可能错过了一些基本的东西。任何帮助表示赞赏。
解决方法
在 JavaScript 中,class
与面向对象编程中的 class
不同。
该类只是 prototype
因此,您的软件中发生的事情是:
- 将类实例添加到公牛队列
- bull 将序列化 redis 中的对象(取决于
toString()
实现) - bull 将在队列中异步运行,从 redis 中获取 string 数据并将其解析为一个对象(例如运行
JSON.parse(aJsonString)
在这个过程中,没有关于 ClasssDefinedSomwhereElse
的信息(就像在 Java 中的类序列化中一样)。
因此,您需要基于 Bull 正在获取的简单 JSON 创建该类的新实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。