添加到 Bull 队列后,对象不再是 Class 的实例

Object no longer instance of Class after adding to Bull queue

在我的Fastify route, I'm adding to my Bullhandler队列中有一个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 的新实例。