[英]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/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 @types/express-http2
,但假設使用了http2
的基礎核心,那么我想這些都不一定。 但是我找不到這樣的東西。
我知道這是一個棘手的類型輸入問題,因為據我所知,所有Express類型都假定使用http
作為基礎服務層編寫。 據我了解,Express本身可以與http2
正常工作,但問題是http2
無法正常工作。
我想念什么嗎?
PS-我更喜歡Express,但是如果有另一個基於Node的Web框架更好地支持http2
和TypeScript的這種組合,我也可以考慮這樣做。
這行不通。 內部express
使用http
模塊。
你可以將它轉換為你做,但你被它鑄造在一定程度上做一劈any
然后再http2.Http2ServerRequest
時,最終它不是 http2.Http2ServerRequest
。
有一個開放的PR支持http2
: https : //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.