0

我有一个 NodeJS / 后台进程问题,我不知道如何以正确的方式“优雅”地解决它。

用户通过 textarea 提交一些(大约 10 个或更多)URL,然后它们应该被异步处理。[必须截取 puppeteer 的屏幕截图,收集一些信息,屏幕截图应进行清晰处理,并将结果保存在 MongoDB 中。通过 GridFS 的屏幕截图和自己的集合中的 URL 以及对屏幕截图的引用]。

虽然这个异步过程是在后台计算的,但只要处理了 URL,就应该更新页面。

有很多方法可以做到这一点,但哪一种是最正确/直接/节省资源的方法?

Browserify,我在浏览器中做吗?不,客户端的东西太多了.. AJAX/Axios 发布并等待 URL 被处理并在侧面反映结果?在响应发送回客户端之前触发进程还是让客户端开始处理?

4

1 回答 1

0

因此,我制作了某种支持长时间运行作业的工作流引擎。我按照本教程https://farazdagi.com/2014/rest-and-long-running-jobs/

这没什么,当创建请求时,您只需返回一个状态代码,当作业完成时,您只需将它们记录在某个地方并使用它。

因为,我使用的 thisEventEmitter在 promise 中使用。这只是我的解决方案可能不优雅,可能完全错误。为你做了一个小POC。

const events = require('events')
const emitter = new events.EventEmitter();

const actualWork = function() {
    return new Promise((res,rej)=>{
        setTimeout(res, 1000);
    })
}
emitter.on('workCompleted', function(){
    // log somewhere
});

app.get('/someroute', (req,res)=>{
    res.json({msg:'reqest initiated', id: 'some_id'})
    actualWork()
    .then(()=>{
        emitter.emit('workCompleted', {id: 'some_id'});
    });
})
app.get('/someroute/id/status', (req,res)=>{
    //get the log
})
于 2018-08-04T18:39:20.873 回答