【发布时间】:2021-03-10 20:10:45
【问题描述】:
我陷入了架构决策。我有 Node + Express 应用程序,它有一个用于上传文件的 API。上传完成后,响应关闭,上传的文件在 Bull Queue + Redis 的帮助下由 FFMPEG 批量处理。这种结构工作正常,但最近我开始测试服务器端事件,以便向最终用户提供有关处理的更新。但是我无法将响应对象传递给 Bull Queue 以将定期更新从服务器写入用户。
1.进口
import childProcess from 'child_process';
import Bull from 'bull'
const Queue = new Bull('background_job', {redis: {port: process.env.port, host: process.env.host, password: process.env.password}});
2。上传功能
const uploadVideo = async(req, res) => {
try{
const result = await authUser(req);
const result2 = await checkUploadFile(result);
const result3 = await insertPost(result2, res);
await Queue.add(result3.data, result3.opts)
} catch(err){
res.status(403).send(err);
}
}
3.承诺
const authUser = (req) => {
return new Promise((resolve, reject) => {
//do some work
})
}
const checkUploadFile = (result) => {
return new Promise((resolve, reject) => {
//do some more work
})
}
const insertPost= (result, res) => {
return new Promise((resolve, reject) => {
//do final work
...........
//preparing server side events
const headers = {
'Content-Type': 'text/event-stream',
'Connection': 'keep-alive',
'Cache-Control': 'no-cache',
'Access-Control-Allow-Origin': '*'
};
res.writeHead(200, headers);
res.write(JSON.stringify({status: true, id: 1})); //testing server side events for the first time
//Let's continue to Bull
const data = {res: res} <- error here: TypeError: Converting circular structure to JSON
const opts = {removeOnComplete: true, removeOnFail: true}
resolve({data: data, opts: opts});
})
}
4.排队过程
Queue.process((job, done) => {
const res = job.data.res
childProcess.execFile('someScript.sh', [`some`, `arguments`], { stdio: ['pipe', 'pipe', 'ignore']}, (err, stderr, stdout) => {
if(err){
done(new Error("Failed: " + err))
res.write(JSON.stringify({status: true, id: 2})); //here using SSE
res.end()
} else {
done()
res.write(JSON.stringify({status: false})); //here using SSE
res.end()
}
})
})
5. PM2 记录的错误
TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Socket'
| property 'parser' -> object with constructor 'HTTPParser'
--- property 'socket' closes the circle
我尝试使用JSON.stringify(res) 将响应对象作为 JSON 传递,但这也不起作用。现在我正在考虑这种方法是否正确,或者我应该使用 Socket.io(这对于简单的服务器端事件来说太过分了)
谢谢
【问题讨论】:
标签: javascript node.js express bull.js