添加到 Bull 队列后,对象不再是 Class 的实例
Object no longer instance of Class after adding to Bull queue
在我的Fastify route, I'm adding to my Bull的handler
队列中有一个class的对象。在队列的处理方法中,此对象不再是 class 的实例。这是正常现象还是我错过了一些(或很多)基础知识?
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
方法中,使用我刚刚传入的对象调用 class 的方法。我不是来自Javascript 背景,所以我想我可能错过了一些基本知识。感谢任何帮助。
在javascript中,class
与面向对象编程中的class
不一样。
class 只是 prototype
的语法糖
所以您的软件中发生的是:
- 添加一个class实例到公牛队列
- bull会序列化redis中的对象(取决于
toString()
实现)
- bull 将 运行 异步队列,从 redis 中获取 string 数据并将其解析为对象(如 运行ning
JSON.parse(aJsonString)
在此过程中,没有关于 ClasssDefinedSomwhereElse
的信息(就像它在 Java 中的 class 序列化中一样)。
因此,您需要根据 Bull 正在获取的简单 JSON 创建该 class 的新实例。
在我的Fastify route, I'm adding to my Bull的handler
队列中有一个class的对象。在队列的处理方法中,此对象不再是 class 的实例。这是正常现象还是我错过了一些(或很多)基础知识?
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
方法中,使用我刚刚传入的对象调用 class 的方法。我不是来自Javascript 背景,所以我想我可能错过了一些基本知识。感谢任何帮助。
在javascript中,class
与面向对象编程中的class
不一样。
class 只是 prototype
所以您的软件中发生的是:
- 添加一个class实例到公牛队列
- bull会序列化redis中的对象(取决于
toString()
实现) - bull 将 运行 异步队列,从 redis 中获取 string 数据并将其解析为对象(如 运行ning
JSON.parse(aJsonString)
在此过程中,没有关于 ClasssDefinedSomwhereElse
的信息(就像它在 Java 中的 class 序列化中一样)。
因此,您需要根据 Bull 正在获取的简单 JSON 创建该 class 的新实例。