我的用例是:我想要创建页面各部分的截图。由于技术原因,它不能在客户端完成(见下面的相关问题),而是需要服务器上的傀儡手。
当我在Heroku上运行这个时,我有一个很小的超时窗口的附加限制。因此,Heroku建议实现一个基于bull.js的排队系统,并将worker进程作为在此解释用于较长时间运行的任务。
我有两个端点(用Express实现),一个用一些配置JSON接收POST请求,另一个在提供作业标识符时响应GET (为了简洁起见稍微修改一下):
这会将作业添加到队列中:
router.post('/', async function(req, res, next) {
let job = await workQueue.add(req.body.chartConfig)
res.json({ id: job.id })
})这将返回有关该作业的信息。
router.get('/:id', async(req, res) => {
let id = req.params.id;
let job = await workQueue.getJob(id);
let state = await job.getState();
let progress = job._progress;
let reason = job.failedReason;
res.json({ id, state, progress, reason });
})在另一个文件中:
const start = () => {
let workQueue = new queue('work', REDIS_URL);
workQueue.process(maxJobsPerWorker, getPNG)
}
const getPNG = async(job) => {
const { url, width, height, chart: chartConfig, chartUrl } = job.data
// ... snipped for brevity
const png = await page.screenshot({
type: 'png',
fullPage: true
})
await page.close()
job.progress(100)
return Promise.resolve({ png })
}
// ...
throng({ count: workers, worker: start })
module.exports.getPNG = getPNG最后的throng调用将start函数指定为从队列中选择作业时要调用的worker函数。start本身指定在处理作业时要调用的getPNG。
我现在的问题是:如何获得生成的图像(png)?理想情况下,我希望能够调用上面的GET端点来返回图像,但我不知道如何传递图像对象。
作为一种更复杂的回退解决方案,我可以想象将图像发布到像imgur这样的图像托管服务中,然后根据GET端点的请求返回URL。但我宁愿,如果可能的话,保持简单。
这个问题是对这个问题的跟进:
https://stackoverflow.com/questions/64837262
复制相似问题