Node.js req против req.stream.session при доступе к свойству alpnProtocol - PullRequest
0 голосов
/ 23 апреля 2020

Использование allowHTTP1 иллюстрируется в документах Node.js v14.0.0 :

const server = http2.createSecureServer(
    { cert, key, allowHTTP1: true },
    onRequest
).listen(4443);

function onRequest(req, res) {
    // Detects if it is a HTTPS request or HTTP/2
    const { socket: { alpnProtocol } } = (req.httpVersion === '2.0')? req.stream.session : req;
    res.writeHead(200, { 'content-type': 'application/json' });
    res.end(JSON.stringify({
        alpnProtocol,
        httpVersion: req.httpVersion
    }));
}

Как показано в примере, следующее строка используется для определения, использует ли пользователь HTTP / 1.1 или HTTP / 2, чтобы он мог получить значение alpnProtocol:

const { socket: { alpnProtocol } } = (req.httpVersion === '2.0')? req.stream.session : req;

Это позволяет ему использовать req.stream.session или просто req в зависимости от версии HTTP. Тем не менее, замена строки следующим по-прежнему работает, несмотря на версию HTTP:

const { socket: { alpnProtocol } } = req;

В чем причина использования троичного оператора для выбора между req и req.stream.session при использовании просто req работает?

1 Ответ

1 голос
/ 23 апреля 2020

В HTTP-запросе req и res будут экземплярами IncomingMessage и ServerResponse соответственно. В запросе HTTP2 req и res вместо этого будут экземплярами Http2ServerRequest и Http2ServerResponse. IncomingMessage не имеет stream, поскольку HTTP не поддерживает двунаправленные потоки Duplex; HTTP2 сделал это функцией. alpnProtocol идентифицирует используемый протокол по его идентификатору ALPN, который является одним из: h3, h2, h2c или http/1.1.

Редактировать:

alpnProtocol от обоих почти идентичны, единственное отличие - это h2c, если он не зашифрован, и связанное свойство encrypted. Посмотрите, как это определено в исходном коде .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...