Экспресс-типы для HTTP2 - PullRequest
0 голосов
/ 29 мая 2018

Я хотел бы использовать модуль http2 в Узле 10 в сочетании с Express и TypeScript (2.8.x).

In может создать экземпляр сервера с чем-то вроде:

import * as http2 from "http2";

let server = http2.createServer({}, app).listen(8080);

Проблема в том, что я получу ошибку типа для app.Проблема в том, что http2.createServer хочет, чтобы второй аргумент имел тип:

(request: http2.Http2ServerRequest, response: http2.Http2ServerResponse) => void

Проблема в том, что согласно @types/express тип app равен (, по-видимому, )):

(req: Request | http.IncomingMessage, res: Response | http.ServerResponse): any

Теперь я могу сделать уродливое приведение типа этого:

import * as http2 from "http2";

let server = http2.createServer({}, (app as any) as ((request: http2.Http2ServerRequest, response: http2.Http2ServerResponse) => void)).listen(8080);

Но проблема действительно позже, когда я пишу свои обработчики Express, кажется, что мне придетсязапишите их как:

(req: express.Request, res: express.Response) => {
  let req2 = (req as any) as http2.Http2ServerRequest;
  let res2 = (res as any) as http2.Http2ServerResponse;
  ...
}

... для того, чтобы получить доступ ко всем функциям http2, таким как push, нет?

Так что мне приходится выполнять эти приведения с обоих концов.Теперь, если бы существовал @types/express-http2, который имел бы все типизации Express, но предполагал базовое ядро ​​http2, то я бы подумал, что ничего из этого не будет обязательно.Но я не смог найти такую ​​вещь.

Я понимаю, что это сложная проблема с типизацией, потому что все экспресс-наборы, насколько я могу судить, написаны с предположением http в качестве основного сервисаслой.Насколько я понимаю, сам Express отлично работает с http2, но проблема в том, что наборы не работают чисто.

Я что-то упустил?

PS - Я бы предпочел Express, но если есть другой веб-фреймворк на основе Node, который лучше поддерживает эту комбинацию http2 и TypeScript, я мог бы рассмотреть это также.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Один из подходов, которые я нашел, заключался в использовании fastify.У них точно нет собственной поддержки http2, но они разрешают доступ к базовому необработанному объекту запроса.Поэтому, когда вы включаете поддержку http2, доступ к этому элементу raw запроса fastify возвращает вам http2.Http2ServerRequest.

. Лучшая часть, с точки зрения TypeScript, состоит в том, что они определилитакие типы, что при передаче параметров конфигурации в fastify он распознает, когда установлен флаг http2, и корректирует тип возвращаемого значения.Таким образом, он полностью безопасен для типов (не требуется приводить к any и обратно).

На данный момент, fastify кажется разумным путем, если вы хотите http2 и наберитебезопасность.Я не использовал его в производстве, поэтому я не могу поручиться за его стабильность или производительность.

0 голосов
/ 29 мая 2018

Это не сработает.Внутренне express использует модуль http.

Вы можете разыграть его, как и вы, но вы в некотором роде взламываете его, превращая его в any, а затем снова в http2.Http2ServerRequest, когда в конечном итоге это не a http2.Http2ServerRequest.

Существует открытый PR для поддержки http2: https://github.com/expressjs/express/pull/3390

...