我想将节点10中的http2
模块与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
的类型是(apparently):
(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,no?
所以我必须在两端做这些演员表。现在,如果有一个@types/express-http2
具有所有Express类型但是假设http2
的底层核心,那么这一切都不一定是我想的。但我无法找到这样的东西。
我认识到这是一个棘手的打字问题,因为据我所知,所有Express类型都是以http
为基础服务层的假设编写的。根据我的理解,Express本身可以与http2
一起使用,但问题是打字不能干净利落。
我错过了什么吗?
P.S。 - 我更喜欢Express,但如果有另一个基于Node的Web框架更好地支持http2
和TypeScript的这种组合,我也可以考虑这一点。
答案 0 :(得分:0)
这不会奏效。内部express
使用http
模块。
你可以按照自己的方式进行投射,但是当你最终将其强加到any
然后再将其http2.Http2ServerRequest
强加给http2.Http2ServerRequest
时,你有点做了一个黑客攻击。{strong>不 a { {1}}。
http2
支持有一个公开的公关:https://github.com/expressjs/express/pull/3390
答案 1 :(得分:0)
我发现的一种方法是使用fastify
。它们并不完全支持http2
,但它们允许访问基础原始请求对象。因此,当您启用http2
支持时,访问raw
请求的fastify
元素会将您移回http2.Http2ServerRequest
。
从TypeScript的角度来看,最好的部分是他们定义了类型,以便在将配置选项传递到fastify
时,它会识别设置http2
标志的时间并调整返回值类型。通过这种方式,它是完全类型安全的(不需要转换为any
并且需要返回)。
目前,fastify
似乎是一种合理的方式,如果你想要http2
并输入安全性。我没有在生产中使用它,所以我不能保证它的稳定性或性能。