噩梦不会连续 运行 两次 - NodeJS
Nightmare doesn't run twice in a row - NodeJS
编辑
我注意到删除 .end()
函数似乎可以解决问题,但在阅读了关于使用 .end()
的 Nightmare 文档后,它说:Completes any queue operations, disconnect and close the electron process.
现在虽然这确实解决了问题,但我现在是否只是在每次调用路由时打开越来越多的电子进程,这最终会导致服务器 运行 内存不足,或者这是一个解决问题的安全方法?
原文
请考虑以下问题:
我正在开发一个基于节点的服务,允许用户请求特定 URL 的屏幕截图。
为此我正在使用Nightmare访问URL,等待2秒,截图,保存到磁盘,转换为base64,删除图像,然后return 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");
上面的代码工作得很好,第一次 运行s。然而,对此的任何后续调用只会立即使用中间的实际代码来控制 "Nightmare starts" 和 "Nightmare Finished",而不是 运行ning。我似乎没有显示任何错误,如果我将它包装在 try/catch 中,则不会捕获任何内容。该节点需要重新启动才能使其再次发生。
值得注意的是我 运行 在无头 ubuntu 机器上运行,因为电子(噩梦依赖项之一)似乎需要 GUI,我正在使用 xvfb 启动节点使用以下命令:
xvfb-run --auto-servernum --server-num=1 node server.js
我假设这可能是某些资源在第一次 运行 时未正确释放的问题,但我们将不胜感激。
也接受对我的代码的任何建设性批评,对 Node 来说非常新,我确定我没有以最佳方式编写(同步文件加载等)
看来您只是把创建噩梦实例的地方弄错了。如果没有更多的代码片段和信息,将无济于事。
方式一
每次都创建噩梦实例并在完成任务后关闭它们。启动实例需要一些时间,但它也会减轻内存负载。更不用说您可以为不同的用户设置多个噩梦实例。
方式 2
不要结束并重复使用相同的噩梦实例。有多个噩梦实例并将呼叫排队以获取屏幕截图。网站加载速度很快,启动实例不会花费时间,但队列较长时您的等待时间会更长。
编辑
我注意到删除 .end()
函数似乎可以解决问题,但在阅读了关于使用 .end()
的 Nightmare 文档后,它说:Completes any queue operations, disconnect and close the electron process.
现在虽然这确实解决了问题,但我现在是否只是在每次调用路由时打开越来越多的电子进程,这最终会导致服务器 运行 内存不足,或者这是一个解决问题的安全方法?
原文
请考虑以下问题:
我正在开发一个基于节点的服务,允许用户请求特定 URL 的屏幕截图。
为此我正在使用Nightmare访问URL,等待2秒,截图,保存到磁盘,转换为base64,删除图像,然后return 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");
上面的代码工作得很好,第一次 运行s。然而,对此的任何后续调用只会立即使用中间的实际代码来控制 "Nightmare starts" 和 "Nightmare Finished",而不是 运行ning。我似乎没有显示任何错误,如果我将它包装在 try/catch 中,则不会捕获任何内容。该节点需要重新启动才能使其再次发生。
值得注意的是我 运行 在无头 ubuntu 机器上运行,因为电子(噩梦依赖项之一)似乎需要 GUI,我正在使用 xvfb 启动节点使用以下命令:
xvfb-run --auto-servernum --server-num=1 node server.js
我假设这可能是某些资源在第一次 运行 时未正确释放的问题,但我们将不胜感激。
也接受对我的代码的任何建设性批评,对 Node 来说非常新,我确定我没有以最佳方式编写(同步文件加载等)
看来您只是把创建噩梦实例的地方弄错了。如果没有更多的代码片段和信息,将无济于事。
方式一
每次都创建噩梦实例并在完成任务后关闭它们。启动实例需要一些时间,但它也会减轻内存负载。更不用说您可以为不同的用户设置多个噩梦实例。
方式 2
不要结束并重复使用相同的噩梦实例。有多个噩梦实例并将呼叫排队以获取屏幕截图。网站加载速度很快,启动实例不会花费时间,但队列较长时您的等待时间会更长。