NodeJS — Ошибка: подключение ECONNREFUSED 127.0.0.1: порт (chrome-remote-interface)

#node.js #linux #puppeteer #chrome-devtools-protocol #chrome-remote-debugging

#node.js #linux #кукловод #chrome-devtools-протокол #chrome-удаленная отладка

Вопрос:

Я создал скрипт с помощью chrome-launcher и chrome-remote-interface для сохранения веб-страницы в формате PDF с помощью Chrome.

На моем компьютере с Windows это работает без каких-либо проблем, но когда я пробую это на CentOS 7, я получаю следующую ошибку и не могу понять, почему. Оба используют Chrome v86.

В Windows я использую NodeJS версии 12.18.4, в Linux я пробовал как версии 15.1, так и версии 12.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, дайте мне знать.

Спасибо

Комментарии:

1. Вы пробовали отключить selinux?

2. Да, ничего не меняется

3. есть ли у вас что-нибудь, прослушивающее порт 43265? поскольку ошибка заключается в том, что ваш скрипт не может подключиться к 127.0.0.1: 43265

4. Кроме того, я ничего не нашел, порт меняется случайным образом при каждом запуске.

5. Попробуйте протестировать соединение с помощью nc 127.0.0.1 43265

Ответ №1:

Я попытался использовать функцию launchChrome () самостоятельно и обнаружил, что это проблема. После некоторых исследований я нашел решение. Мне пришлось добавить ‘—no-sandbox’ в chromeLauncher.флаги запуска.

Здесь полностью рабочий код:

 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();
    });
  })();