Cloud9: не удалось найти открытый порт - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в NodeJS и пытаюсь настроить существующий проект (разработанный кем-то другим) в Cloud9 IDE (я использую старую учетную запись Cloud9; поэтому не работает в AWS).Я вытащил мерзавца и установил все.Казалось, все это прошло без проблем.

Чтобы запустить приложение локально, вне Cloud9, вы должны запустить сервер с npm run start (я знаю от человека, который разработал приложение, это работает для него).Но я хочу настроить его в Cloud9, а в Cloud9 необходимо сначала установить некоторые переменные (если я сначала не определяю хост, выдается ошибка «Invalid Host header»).Поэтому я использую следующие две команды:

export HOST=$C9_HOSTNAME && export PORT=8080
npm run start

npm run start выдает ошибку:

Не удалось найти открытый порт на appname-username.c9users.io.

Сообщение об ошибке сети: прослушать EADDRNOTAVAIL 35.189.252.103

Я считаю, что порт правильный, учитывая https://docs.c9.io/docs/run-an-application. Я также пробовал значения 8081, 8082 и$ PORT, но ничего из этого не работает.

Есть идеи, как заставить работать локальный предварительный просмотр Cloud9?


По запросу несколько строк из start.js:

const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000;
const HOST = process.env.HOST || '0.0.0.0';
console.log(`1. The host is ${HOST} on port ${DEFAULT_PORT}`);  //ADDED

choosePort(HOST, DEFAULT_PORT)
  .then(port => {
    console.log(`2. The host is ${HOST} on port ${DEFAULT_PORT}`);  //ADDED
    if (port == null) {
      // We have not found a port.
      return;
    }
    const protocol = process.env.HTTPS === 'true' ? 'https' : 'http';
    const appName = require(paths.appPackageJson).name;
    const urls = prepareUrls(protocol, HOST, port);
    // Create a webpack compiler that is configured with custom messages.
    const compiler = createCompiler(webpack, config, appName, urls, useYarn);
    // Load proxy config
    const proxySetting = require(paths.appPackageJson).proxy;
    const proxyConfig = prepareProxy(proxySetting, paths.appPublic);
    // Serve webpack assets generated by the compiler over a web sever.
    const serverConfig = createDevServerConfig(
      proxyConfig,
      urls.lanUrlForConfig
    );
    const devServer = new WebpackDevServer(compiler, serverConfig);
    // Launch WebpackDevServer.
    devServer.listen(port, HOST, err => {
      if (err) {
        return console.log(err);
      }
      if (isInteractive) {
        clearConsole();
      }
      console.log(chalk.cyan('Starting the development server...\n'));
      openBrowser(urls.localUrlForBrowser);
    });

  })
  .catch(err => {
    if (err && err.message) {
      console.log(err.message);
    }
    process.exit(1);
  });

netstat --listen отвечает следующей информацией:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     1533837857 /home/ubuntu/.c9/6614254/collab.sock
unix  2      [ ACC ]     STREAM     LISTENING     1533835235 /home/ubuntu/.c9/bridge.socket
unix  2      [ ACC ]     STREAM     LISTENING     1533836998 /tmp/tmux-1000/cloud92.2

Функция choosePort является частью узла-модуля «response-dev-utils» и гласит:

function choosePort(host, defaultPort) {
  return detect(defaultPort, host).then(
    port => new Promise(resolve => {
      if (port === defaultPort) {
        return resolve(port);
      }
      if (isInteractive) {
        clearConsole();
        const existingProcess = getProcessForPort(defaultPort);
        const question = {
          type: 'confirm',
          name: 'shouldChangePort',
          message: chalk.yellow(
            `Something is already running on port ${defaultPort}.` +
              `${existingProcess ? ` Probably:\n  ${existingProcess}` : ''}`
          ) + '\n\nWould you like to run the app on another port instead?',
          default: true,
        };
        inquirer.prompt(question).then(answer => {
          if (answer.shouldChangePort) {
            resolve(port);
          } else {
            resolve(null);
          }
        });
      } else {
        console.log(
          chalk.red(`Something is already running on port ${defaultPort}.`)
        );
        resolve(null);
      }
    }),
    err => {
      throw new Error(
        chalk.red(`Could not find an open port at ${chalk.bold(host)}.`) +
          '\n' +
          ('Network error message: ' + err.message || err) +
          '\n'
      );
    }
  );
}

1 Ответ

0 голосов
/ 28 декабря 2018

Я немного погуглил по этому поводу и думаю, что проблема может быть в значении хоста, которое вы устанавливаете.В этот поток поддержки Cloud9 , который ссылается на похожую ошибку:

... Вместо этого вам нужно использовать 0.0.0.0, поскольку c9user.io является публичным адресом прокси.Или измените файл / etc / hosts.echo "0.0.0.0 $ C9_HOSTNAME" |sudo tee -a / etc / hosts

Итак, попробуйте установить хост на 0.0.0.0 вместо публичного имени хоста:

export HOST=0.0.0.0 && export PORT=8080 && npm run start

Также только что нашел это на страница поддержки , на которую вы ссылаетесь:

Если вы разрабатываете серверное приложение, обратите внимание, что вам необходимо прослушать 0.0.0.0 ($ IP) и 8080 ($ PORT).Прослушивание этого порта позволит вашему приложению быть видимым на http://-.c9users.io

Прослушивание 0.0.0.0 должно решить проблему.

Редактировать (в ответ на возвращаемую дополнительную ошибку):

Для ошибки «Недопустимый заголовок хоста», я думаю, вы на правильном пути, установив disableHostCheck в значение true, ноВаша команда сценария npm, скорее всего, не придерживается флага из CLI.Вероятно, есть несколько способов передать этот флаг, но самым простым может быть обновление вашего кода, чтобы установить опцию при создании сервера dev.Имейте в виду, что это просто быстрое решение, чтобы увидеть, сможем ли мы заставить его работать.Было бы лучше обновить функцию createDevServerConfig, чтобы установить параметр:

const devServer = new WebpackDevServer(compiler, { ...serverConfig, disableHostCheck: true});

Другое редактирование:

Параметр disableHostCheck небезопасен и может открыть вас для уязвимостей.Это считается быстрым решением при локальном тестировании и должно использоваться только в закрытой сети.Чтобы исправить «Недопустимый заголовок узла» в открытой среде, используйте параметр public, где public - это имя вашего DNS-узла или общедоступный IP-адрес:

const devServer = new WebpackDevServer(compiler, { ...serverConfig, public: process.env.PUBLIC_HOST }

Затем вы можете передать это значение черезсреда CLI, как и другие ваши переменные:

export HOST=0.0.0.0 && export PORT=8080 && export PUBLIC_HOST=$C9_HOSTNAME:8080 && npm run start

Отказ от ответственности: я не думаю, что вышеописанные изменения - лучший способ сделать это (вероятно, было бы лучше обновить функцию createDevServerConfig,но они должны решить ваши проблемы. Более подробную информацию о disableHostCheck можно найти здесь , здесь и здесь .

...