Простой http2 NodeJS сервер из официальных документов и почтальон не работает - PullRequest
0 голосов
/ 24 апреля 2019

Я учусь строить сервер http2 с NodeJS 10 LTS Официальная документация .Я скопировал, вставил код серверной части в server.js и запустил на нем узел, но когда я пытаюсь соединиться с почтальоном (инструмент тестирования REST), я получаю ошибку.

const http2 = require('http2');
const fs = require('fs');

const server = http2.createSecureServer({
  key: fs.readFileSync('localhost-privkey.pem'),
  cert: fs.readFileSync('localhost-cert.pem')
});
server.on('error', (err) => console.error(err));

server.on('stream', (stream, headers) => {
  // stream is a Duplex
  stream.respond({
    'content-type': 'text/html',
    ':status': 200
  });
  stream.end('<h1>Hello World</h1>');
});

server.listen(8443);

Ошибка, которую я получаю от почтальонавыглядит следующим образом:

Unknown ALPN Protocol, expected `h2` to be available.
If this is a HTTP request: The server was not configured with the `allowHTTP1` option or a listener for the `unknownProtocol` event.

Вещи, которые я пытался решить проблему:

  1. В соответствии с требованиями официальной документации, я создал частный и публичный сертификат (.pem).
  2. Я включил публичный сертификат в программное обеспечение почтальона.Так что теперь единственная ошибка, которую я получаю, - это упомянутая выше (Неизвестный протокол ALPN).

Что еще нужно для того, чтобы пример в официальных документах работал?Я не смог найти для этого онлайн-ресурсы, и все предыдущие вопросы о стековом потоке относятся к старым версиям NodeJS, когда http2 еще не был встроенным.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Хорошо, после тщательного расследования я в значительной степени нашел удовлетворительный ответ.

  1. Запрос https должен быть https://localhost:8443/stream, чтобы получить ответ от сервера с Hello World. Без пути потока нет ответа.
  2. почтальон дает 403 ответа после установки публичного сертификата, но бессонница не дает никакого ответа.
  3. Используя инструменты разработчика Google Chrome на вкладке Сеть, я наконец могу получить ответ 200 OK с сервера, как показано ниже.

enter image description here

0 голосов
/ 24 апреля 2019

Попробуйте добавить allowHTTP1: true в параметрах сервера: в нем указано, что сервер не настроен с allowHTTP1

const server = http2.createSecureServer({
  key: fs.readFileSync('localhost-privkey.pem'),
  cert: fs.readFileSync('localhost-cert.pem')
});

К

const server = http2.createSecureServer({
  key: fs.readFileSync('localhost-privkey.pem'),
  cert: fs.readFileSync('localhost-cert.pem'),
  allowHTTP1: true
});

Из документации по github http2:

allowHTTP1 {boolean} Входящие клиентские подключения, которые не поддерживают HTTP / 2, будут понижены до HTTP / 1.x, если установлено значение true. Смотрите событие unknownProtocol. Смотрите переговоры ALPN. По умолчанию: false.

Здесь я нашел лучший ответ уже в Stackoverflow Настройка HTTP2-сервера NodeJS

...