编辑

我注意到删除了.end()函数似乎可以解决该问题,但是在阅读有关.end()使用的 Nightmare 文档后,它说:Completes any queue operations, disconnect and close the electron process.
现在虽然确实可以解决问题,但是我现在是否只是在每次调用路由时都打开越来越多的 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 (梦night依赖之一)似乎需要GUI,所以我正在使用xvfb通过以下命令启动 Node :
xvfb-run --auto-servernum --server-num=1 node server.js

我假设这可能是一个问题,因为某些资源在第一次运行时未正确释放,但是可以提供任何帮助。

也对我的代码有 build 性的批评开放,这对Node来说是很陌生的,并且我确定我不是以最佳方式编写的(同步文件加载等)

最佳答案

看来您只是在创建梦m实例的地方放错了位置。如果没有更多的代码片段和信息,将无济于事。

方式1

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

方式二

不要结束并重复使用同一 Nightmare 实例。有多个 Nightmare 实例,并将通话排队等待截图。网站将快速加载,并且不需要花费时间来启动实例,但是您将有更长的等待时间以等待更长的队列。

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

10-09 22:07