HTTP2的快速类型

时间:2018-05-28 22:34:16

标签: node.js typescript express http2

我想将节点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/expressapp的类型是(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的这种组合,我也可以考虑这一点。

2 个答案:

答案 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并输入安全性。我没有在生产中使用它,所以我不能保证它的稳定性或性能。