0

handler我的Fastify路线中,我将一个类的对象添加到我的Bull队列中。在队列的 process 方法中,这个对象不再是类的实例。这是正常的还是我错过了一些(或很多)基础知识?

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。为什么是这样?processfalse

我最终要做的是,在process方法中,使用我刚刚传入的对象调用类的方法。我不是 Javascript 背景,所以我想我可能错过了一些基本的东西。任何帮助表示赞赏。

4

1 回答 1

1

在 javascript 中,class, 与class面向对象编程中的不同。类只是语法糖prototype

因此,您的软件中发生的情况是:

  • 将类实例添加到公牛队列
  • 公牛将序列化redis中的对象(取决于toString()实现)
  • Bull 将在队列中异步运行,从 redis 获取字符串数据并将其解析为对象(如运行JSON.parse(aJsonString)

在这个过程中,没有关于 的信息ClasssDefinedSomwhereElse(就像在 Java 中的类序列化中一样)。因此,您需要根据 Bull 获取的简单 JSON 创建该类的新实例。

于 2021-02-07T08:53:21.837 回答