我希望将Node10中的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的类型是(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功能,如推送,不是吗?
所以我必须在两端都做这些模型。现在,如果有一个拥有所有Express类型的@types/express-http2,但假设一个底层核心是http2,那么我认为这些都不一定是。但我找不到这样的东西。
我认识到这是一个棘手的类型问题,因为据我所知,所有的Express类型都是以http作为底层服务层的假设编写的。据我所知,Express本身在http2上工作得很好,但问题是类型不能很好地工作。
我是不是遗漏了什么?
附注:我更喜欢Express,但如果有另一个基于Node的web框架能更好地支持http2和TypeScript的这种组合,我也可以考虑。
发布于 2018-05-30 02:09:22
这行不通的。在内部,express使用http模块。
你可以像现在这样转换它,但是当它最终是而不是a http2.Http2ServerRequest时,你通过将它转换为any,然后再转换为http2.Http2ServerRequest,这在某种程度上是一种黑客行为。
有一个支持http2的开放公关:https://github.com/expressjs/express/pull/3390
发布于 2018-05-31 02:55:37
我发现的一种方法是使用fastify。它们并不完全具有对http2的本地支持,但它们允许访问底层的原始请求对象。因此,当您启用http2支持时,访问fastify请求raw元素将返回一个http2.Http2ServerRequest。
从TypeScript的角度来看,最好的部分是它们定义了类型,这样当您将配置选项传递给fastify时,它就会识别何时设置了http2标志并调整返回类型。通过这种方式,它是完全类型安全的(不需要强制转换为any和back )。
就目前而言,如果您想要http2和类型安全,fastify似乎是一个合理的方法。我还没有在生产中使用过它,所以我不能保证它的稳定性或性能。
https://stackoverflow.com/questions/50574125
复制相似问题