簡體   English   中英

HTTP2的快速類型

[英]Express Types for HTTP2

我想將Node 10中的http2模塊與Express和TypeScript(2.8.x)結合使用。

可以使用以下方式實例化服務器:

import * as http2 from "http2";

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

問題是我會收到app的類型錯誤。 問題是http2.createServer希望第二個參數的類型為:

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

問題是,根據@types/expressapp的類型是( 顯然 ):

(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 @types/express-http2 ,但假設使用了http2的基礎核心,那么我想這些都不一定。 但是我找不到這樣的東西。

我知道這是一個棘手的類型輸入問題,因為據我所知,所有Express類型都假定使用http作為基礎服務層編寫。 據我了解,Express本身可以與http2正常工作,但問題是http2無法正常工作。

我想念什么嗎?

PS-我更喜歡Express,但是如果有另一個基於Node的Web框架更好地支持http2和TypeScript的這種組合,我也可以考慮這樣做。

這行不通。 內部express使用http模塊。

你可以將它轉換為你做,但你被它鑄造在一定程度上做一劈any然后再http2.Http2ServerRequest時,最終它不是 http2.Http2ServerRequest

有一個開放的PR支持http2https : //github.com/expressjs/express/pull/3390

我發現的一種方法是使用fastify 它們不完全具有對http2本機支持,但允許訪問基礎的原始請求對象。 因此,當您啟用http2支持時,訪問fastify請求的raw元素fastify您返回http2.Http2ServerRequest

從TypeScript的角度來看,最好的部分是它們已經定義了類型,以便在將配置選項傳遞給fastify ,它可以識別何時設置了http2標志並調整了返回類型。 這樣,它是完全類型安全的(不需要強制轉換為any類型,並且不需要強制轉換)。

目前,如果您要使用http2並輸入安全性, fastify似乎是一種合理的方法。 雖然我沒有在生產中使用它,所以我不能保證它的穩定性或性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM