微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决添加到 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 打印 trueprocess 方法打印 false。这是为什么?

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

解决方法

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

的语法糖

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。