首页 文章

梦魇不会连续两次运行 - NodeJS

提问于
浏览
1

EDIT

我注意到删除了 .end() 函数似乎解决了这个问题,但在阅读了关于使用 .end() 的梦魇文档后,它说: Completes any queue operations, disconnect and close the electron process.

现在虽然这确实解决了问题,但我现在只是在每次调用路径时打开越来越多的电子流程,这最终会导致服务器耗尽内存,或者这是解决问题的安全方法吗?

ORIGINAL TEXT

请考虑以下问题:

我正在开发一个基于节点的服务,允许用户请求特定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");

上面的代码运行得很好,第一次运行 . 然而,任何后来对此的调用都会立即调用“梦魇开始”和“梦魇完成”,实际代码中间没有运行 . 我似乎没有显示任何错误,如果我将它包装在try / catch中,则不会捕获任何内容 . 该节点需要重新启动才能再次发生 .

值得注意的是,我在无头ubuntu机器上运行,因为电子(噩梦依赖之一)似乎需要GUI,我使用xvfb使用以下命令启动节点:

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

我假设这可能是一些资源在第一次运行时没有正确发布的问题,但任何帮助将不胜感激 .

也对我的代码的任何建设性批评开放,对Node非常新,我确定我不是以最优的方式编写(同步文件加载等)

1 回答

  • 1

    您似乎只是错放了创建恶梦实例的位置 . 没有更多的代码片段和信息就无济于事 .

    方式1

    每次创建恶梦实例并在完成任务后关闭它们 . 启动实例需要一些时间,但也会减少内存负载 . 更不用说你可以为不同的用户提供多个噩梦实例 .

    方式2

    不要结束并重复使用相同的梦魇实例 . 拥有多个恶梦实例并将调用排队以进行屏幕截图 . 网站将加载速度快,启动实例不会花费时间,但是您将有更长的等待时间来获得更长的队列 .

相关问题