一种方式是使用 async/await 将 Bull 的作业处理程序包装在一个函数中,并使用 Promise 将其返回。然后,在 Express 路由中使用 await 调用此函数,以便在作业完成后继续进行路由处理。以下是一个示例:
const { Queue } = require('bull');
const myQueue = new Queue('myQueue');
async function handleJob(job) {
console.log(`Starting job ${job.id}`);
// Do some work here
console.log(`Job ${job.id} finished!`);
return true;
}
async function processJob(job) {
const result = await handleJob(job);
return Promise.resolve(result);
}
app.post('/jobs', async (req, res) => {
const { data } = req.body;
await myQueue.add(data);
res.json({
message: 'Job enqueued!'
});
});
app.get('/jobs', async (req, res) => {
const jobs = await myQueue.getJobs();
res.json(jobs);
});
app.get('/jobs/:id', async (req, res) => {
const { id } = req.params;
const job = await myQueue.getJob(id);
res.json(job);
});
app.post('/process-jobs', async (req, res) => {
const jobs = await myQueue.getJobs();
for (const job of jobs) {
await processJob(job);
}
res.json({
message: 'All jobs processed!'
});
});
在上面的例子中,我们将处理作业的代码封装在 handleJob
函数中,并将其包装在 processJob
函数中,该函数返回一个 Promise。在路由处理函数中,我们使用 await
调用 processJob
函数,以防请求阻塞直到作业完成。