node.js - Nightmare 不会连续运行两次 - NodeJS

标签 node.js phantomjs electron nightmare

编辑

我注意到删除 .end() 函数似乎可以解决该问题,但在阅读了有关使用 .end() 的 Nightmare 文档后,它说:完成所有队列操作,断开并关闭 Electron 进程。

现在,虽然这确实解决了问题,但我现在是否只是在每次调用路由时打开越来越多的 Electron 进程,这最终会导致服务器内存不足,或者这是解决问题的安全方法?

原文

请考虑以下问题:

我正在开发一个基于 Node 的服务,该服务将允许用户请求特定 URL 的屏幕截图。

为此,我使用 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");

上面的代码第一次运行时工作得很好。然而,对此的任何后续调用都只会立即控制台“Nightmare 开始”和“Nightmare 结束”,而中间的实际代码不会运行。我似乎没有显示任何错误,如果我将其 package 在 try/catch 中,则不会捕获任何内容。该 Node 需要重新启动才能再次发生。

值得注意的是,我正在 headless ubuntu 机器上运行,因为 Electron ( Nightmare 依赖项之一)似乎需要 GUI,我使用 xvfb 使用以下命令启动 Node :

xvfb-run --auto-servernum --server-num=1 node server.js

我假设这可能是一些资源在第一次运行时未正确释放的问题,但我们将不胜感激。

也愿意接受对我的代码的任何建设性批评,对于 Node 来说非常陌生,我确信我没有以最优化的方式编写(同步文件加载等)

最佳答案

看来您只是放错了创建 Nightmare 实例的位置。如果没有更多代码片段和信息,就无法提供太多帮助。

方式 1

每次创建 Nightmare 实例并在完成任务后关闭它们。启动实例需要一些时间,但也会减轻内存负载。更不用说您可以为不同的用户拥有多个 Nightmare 实例。

方式2

不要结束并重复使用同一个 Nightmare 实例。有多个 Nightmare 实例并对屏幕截图的调用进行排队。网站加载速度很快,启动实例不需要时间,但队列较长,您的等待时间会更长。

关于node.js - Nightmare 不会连续运行两次 - NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48668750/

相关文章:

javascript - 如何在类中正确 require Electron BrowserWindow

node.js - 安装node-inspector时出现问题

node.js - 如何在 NodeJS 中模拟 Rethinkdb 以对我的 DAO 进行单元测试

javascript - 如何为 Window Store 构建 Electron 应用程序?

selenium - 如何使用 PhantomJS 在 Geb/Selenium 中设置 cookie

javascript - 在页面上下文中的控制台日志之间在 PhantomJS 中等待一段时间

web-applications - 非技术人员可以使用 Github 的 Electron 在 Mac 上构建特定于站点的浏览器的最简单方法是什么?

node.js - 如何在测试期间提高 puppeteer 启动性能

node.js - Jade 模板中静态文件的路由路径的 Express/Node 问题

java - PhantomJS 和导体框架