【问题标题】:Object no longer instance of Class after adding to Bull queue添加到 Bull 队列后,对象不再是 Class 的实例
【发布时间】:2021-02-05 23:36:25
【问题描述】:

在我的Fastify 路由的handler 中,我将一个类的对象添加到我的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 打印 trueprocess 方法打印 false。这是为什么呢?

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

【问题讨论】:

    标签: javascript class object fastify bull-queue


    【解决方案1】:

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

    所以在您的软件中发生的情况是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多