-1

我正在尝试类似的东西:

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对象实例注入作业的原因是因为我在nestjs中使用了一个单独的进程并且没有可用的依赖注入。我需要访问该服务才能从进程中执行某些数据库操作。我不想在每次进程运行时都创建单独的数据库连接。

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

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

4

1 回答 1

0

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

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

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

发送与服务匹配的 id 怎么样?就像是this.service.id

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

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

于 2021-06-10T19:32:52.493 回答