NodeJS Bull queue.add stringify 数据导致错误

问题描述

我正在尝试类似的东西:

queue.add('queue',{
      someId: '123',service: this.service,// a service injected into the class where queue.add is present
    },{ // other opts });

我收到错误

(node:94191) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
    at JSON.stringify (<anonymous>)
    at Job.toData (<project>/node_modules/bull/lib/job.js:192:20)
    at addJob (<project>/node_modules/bull/lib/job.js:80:23)
    at queue.isReady.then (<project>/node_modules/bull/lib/job.js:94:14)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:94191) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block,or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

我相信它来自 https://github.com/OptimalBits/bull/blob/develop/lib/job.js#L190-L200 .

似乎认是尝试和字符串化整个作业对象,包括数据字段。因此,它会抱怨无法完全字符串化的数据字段。没有办法解决这个问题吗?有没有办法将作业添加到具有不可字符串化的自定义数据字段的队列中?

我将 service 对象实例注入作业的原因是我在 separate process 中使用了 nestjs 并且没有可用的依赖项注入。我需要访问该服务才能在流程中执行某些数据库操作。我不想每次进程运行时都创建一个单独的数据库连接。

任何帮助将不胜感激,谢谢。

编辑:我认为我在这里的假设是不正确的。 Redis 本身不能存储非字符串化的值。

解决方法

似乎默认是尝试和字符串化整个作业对象,包括数据字段。因此,它会抱怨无法完全字符串化的数据字段。没有办法解决这个问题吗?

您可以exclude properties,但这可能不是您想要的(服务属性将被忽略)。

我将服务对象实例注入作业的原因是因为我在 nestjs 中使用了一个单独的进程并且没有可用的依赖注入

发送一个与服务匹配的 id 怎么样?类似于 this.service.id

我需要访问该服务才能在进程内执行某些数据库操作。我不想每次进程运行时都创建一个单独的数据库连接

也许您的服务可以公开您的工作人员可以使用的某种 API,以便所有数据库通信仍然发生在服务级别?