NodeJS - Error: connect ECONNREFUSED 127.0.0.1:port (chrome-remote-interface)

NodeJS - Error: connect ECONNREFUSED 127.0.0.1:port (chrome-remote-interface)

我使用 chrome-launcherchrome-remote-interface 创建了一个脚本来保存一个使用 Chrome.

将网页转为 pdf

它在我的 Windows 机器上没有任何问题,但是当我在 CentOS 7 上尝试时,我收到以下错误,我无法弄清楚原因。两者都使用 Chrome v86.

在 Windows 我使用 NodeJS v12.18.4 在 Linux 我尝试了 v15.1 和 v12.19

SELinux 状态:禁用

我尝试检查是否有其他应用程序正在使用错误中的端口,但没有。

node:internal/process/promises:218
    triggerUncaughtException(err, true /* fromPromise */);
    ^

Error: connect ECONNREFUSED 127.0.0.1:43265
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1128:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 43265
}

我的代码:

const chromeLauncher = require('chrome-launcher');
const CDP = require('chrome-remote-interface');
const file = require('fs');
var check = 1;

(async function() {
  async function launchChrome() {
    return await chromeLauncher.launch({
      chromeFlags: [
        '--no-first-run',
        '--headless',
        '--disable-gpu'
      ]
    });
  }

  const chrome = await launchChrome();
  const protocol = await CDP({
    port: chrome.port
  });

  const {
    DOM,
    Page,
    Emulation,
    Runtime
  } = protocol;

  await Promise.all([
    Page.enable(),
    Runtime.enable(),
    DOM.enable()
  ]);

  const {
    frameId
  } = await Page.navigate({
    url: 'https://url/'
  });
  await Page.loadEventFired();
  const script1 = "window.status";
  while (check) {
    var result = await Runtime.evaluate({
      expression: script1
    });
    if (result.result.value == 'ready_to_print') {
      check = 0;
    }
  }

  let {
    data
  } = await Page.printToPDF({
    landscape: false,
    printBackground: true,
    scale: 0.7
  });

  file.writeFile('print.pdf', Buffer.from(data, 'base64'), 'base64', function(err) {
    if (err) {
      console.log(err);
    }

    protocol.close();
    chrome.kill();
  });
})();

如果您有其他方法使用 Chrome 并缩放到 0.7,请告诉我。

谢谢

我尝试单独使用 launchChrome() 函数,发现是问题所在。经过一些研究,我找到了解决方案。我必须在 chromeLauncher.launch 标志中添加“--no-sandbox”。

这里是完整的工作代码:

const chromeLauncher = require('chrome-launcher');
const CDP = require('chrome-remote-interface');
const file = require('fs');
var check = 1;

(async function() {
    async function launchChrome() {
      return await chromeLauncher.launch({
        chromeFlags: [
          '--no-first-run',
          '--headless',
          '--disable-gpu',
          '--no-sandbox'
        ]
      });
    }

    const chrome = await launchChrome();
    const protocol = await CDP({
      port: chrome.port
    });

    const { DOM, Page, Emulation, Runtime } = protocol;

    await Promise.all([
      Page.enable(),
      Runtime.enable(),
      DOM.enable()
    ]);

    const { frameId } = await Page.navigate({ url: 'https://url/' });
    await Page.loadEventFired();
    const script1 = "window.status";
    while(check){
        var result = await Runtime.evaluate({
            expression: script1
        });
        if(result.result.value=='ready_to_print'){
            check = 0;
        }
    }

    let { data } = await Page.printToPDF({
      landscape: false,
      printBackground: true,
      scale: 0.7
    });

    file.writeFile('print.pdf', Buffer.from(data, 'base64'), 'base64', function(err) {
      if (err) {
        console.log(err);
      }

      protocol.close();
      chrome.kill();
    });
  })();