修改
我注意到删除.end()
功能似乎可以解决问题,但在阅读关于使用.end()
的梦魇文档后,它说:Completes any queue operations, disconnect and close the electron process.
现在虽然这确实解决了问题,但我现在只是在每次调用路径时打开越来越多的电子流程,这最终会导致服务器耗尽内存,或者这是解决问题的安全方法?
原文
请考虑以下问题:
我正在开发基于节点的服务,允许用户请求特定网址的截图。
为此,我使用Nightmare访问URL,等待2秒,截取屏幕截图,保存到磁盘,将其转换为base64,删除图像,然后返回base64字符串。
console.log('Nightmare starts');
nightmare
.goto(url)
.wait(2000)
.screenshot(filename)
.end()
.then(function (result)
{
fs.exists(filename, function(exists)
{
if (exists)
{
data = fs.readFileSync(filename);
var base64 = data.toString('base64')
fs.unlink(filename);
var output = {'message':'success','map_image':base64};
res.send(output);
}
});
})
.catch(function (error)
{
console.error('Search failed:', error);
});
console.log("Nightmare Finished");
上面的代码运行得很好,第一次运行。然而,任何随后的呼叫只是控制台"梦魇开始"和#34;梦魇结束"即时与实际代码之间没有运行。我似乎没有显示任何错误,如果我将它包装在try / catch中,则不会捕获任何内容。该节点需要重新启动才能再次发生。
值得注意的是,我在无头ubuntu机器上运行,因为电子(噩梦依赖之一)似乎需要一个GUI,我使用xvfb使用以下命令启动节点:
xvfb-run --auto-servernum --server-num=1 node server.js
我认为这可能是某些资源在第一次运行时未正确发布的问题,但任何帮助都会受到赞赏。
对我的代码也有任何建设性的批评,对Node非常新,我确定我不是以最优的方式编写(同步文件加载等)
答案 0 :(得分:2)
您似乎只是错放了创建恶梦实例的位置。没有更多的代码片段和信息,就无济于事。
每次创建恶梦实例并在完成任务后关闭它们。启动实例需要一些时间,但也会减少内存负载。更不用说你可以为不同的用户提供多个噩梦实例。
不要结束并重复使用相同的梦魇实例。拥有多个恶梦实例并将调用排队以进行屏幕截图。这些网站会加载速度很快,并且不会花时间来启动实例,但是你需要更长的等待时间才能获得更长的队列。