node.js - NodeJS - 错误 : connect ECONNREFUSED 127. 0.0.1:port (chrome-remote-interface)

标签 node.js linux puppeteer chrome-devtools-protocol chrome-remote-debugging

我使用 制作了一个脚本 Chrome 发射器 Chrome 远程接口(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();
    });
  })();

关于node.js - NodeJS - 错误 : connect ECONNREFUSED 127. 0.0.1:port (chrome-remote-interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64788142/

相关文章:

node.js - 如何在nodejs中运行长时间运行的同步操作

python - x = os.system(..) 的返回值

node.js - 为什么 Puppeteer 在页面上找不到这个链接元素?

api - 使用node-trello模块发送post请求

javascript - 将 Buffer 转换为自定义基础的最佳方法是什么?

c - 如何访问时间结构的字段

javascript - puppeteer 总是在一个网站上超时

javascript - Node Js & Puppeteer - 如何选择包裹在 anchor 标签内的文本

javascript - 如何使用 npm init 创建 Node 项目?陷入版本困境

c++ - 将十六进制发送到 xbee radio 模块