Closed l3th2nh closed 1 year ago
Please see the test suite on specific examples of scheduling
yes @timgit that error even when i follow your instructions
const helper = require('./testHelper')
async function readme () { const PgBoss = require('../src') const boss = new PgBoss(helper.getConnectionString())
boss.on('error', console.error)
await boss.start()
const queue = 'some-queue'
await boss.schedule(queue, ' *')
console.log(created cronjob in queue ${queue}
)
await boss.work(queue, someAsyncJobHandler) }
async function someAsyncJobHandler (job) {
console.log(running job ${job.id}
)
}
readme()
Hi @timgit
Thank you for your awesome library.
I encountered the same issue while developing my Strapi plugin. It's not a pg-boss
issue, but perhaps the quick research I've done might be useful to someone and save them some time. The issue can be reproduced using the example from the docs, as mentioned by @l3th2nh.
I am developing a custom Strapi plugin that needs to run jobs on a schedule. The problem occurs only with the strapi
dependency and the following happens:
We read a job from the database: https://github.com/timgit/pg-boss/blame/9.0.3/src/manager.js#L497
result = await db.executeSql(preparedStatement, statementValues)
But the result we get has a string in the data
field instead of an object. In the database, this JSONB
field is stored correctly.
result:
[
{
id: "a6124734-aa2a-4a20-84e3-1001f159cf1d",
name: "__pgboss__send-it",
// data is a STRING, BUT EXPECTED OBJECT:
data: "{\"cron\": \"* * * * *\", \"data\": null, \"name\": \"some-queue\", \"options\": \"{}\", \"timezone\": \"UTC\", \"created_on\": \"2024-06-26T10:07:33.996Z\", \"updated_on\": \"2024-06-26T10:38:47.481Z\"}",
expire_in_seconds: 900,
},
]
// typeof result.rows[0].data -> 'string'
As a result, in onSendIt https://github.com/timgit/pg-boss/blob/9.0.3/src/timekeeper.js#L198
we cannot extract name
, data
, options
:
async onSendIt (job) {
if (this.stopped) return
const { name, data, options } = job.data // name, data, and options are undefined because job.data is a string
await this.manager.send(name, data, options)
}
and we make an incorrect call: await this.manager.send(undefined, undefined, undefined);
This call, of course, does not pass the assertion: https://github.com/timgit/pg-boss/blob/9.0.3/src/attorney.js#L52
And the job fails with the message mentioned earlier: "message": "boss requires all jobs to have a queue name"
The issue of reading JSONB as a string is due to this strapi parser: https://github.com/strapi/strapi/blob/v4.25.1/packages/core/database/src/dialects/postgresql/index.ts#L27-L31
This topic is being discussed here: https://github.com/strapi/strapi/issues/18073 I also provided a workaround in that thread.
who can help me ? when i tried set a schedule by example :
await boss.schedule('notification-abc', '0 3 * * *', null, { tz: 'America/Chicago' })
i get a error
{ "code": "ERR_ASSERTION", "name": "AssertionError", "stack": "AssertionError [ERR_ASSERTION]: boss requires all jobs to have a queue name\n at Object.checkSendArgs (/srv/app/node_modules/pg-boss/src/attorney.js:52:3)\n at Manager.send (/srv/app/node_modules/pg-boss/src/manager.js:339:46)\n at Timekeeper.onSendIt (/srv/app/node_modules/pg-boss/src/timekeeper.js:199:24)\n at /srv/app/node_modules/pg-boss/src/timekeeper.js:56:164\n at pMap.concurrency (/srv/app/node_modules/pg-boss/src/manager.js:232:32)\n at /srv/app/node_modules/p-map/index.js:57:28\n at processTicksAndRejections (node:internal/process/task_queues:96:5)", "message": "boss requires all jobs to have a queue name", "expected": true, "operator": "==", "generatedMessage": false }