【问题标题】:Express Types for HTTP2HTTP2 的 Express 类型
【发布时间】:2018-11-07 12:07:25
【问题描述】:

我想将 Node 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 功能,如推送,不是吗?

所以我必须在两端都进行这些演员表。现在,如果有一个 @types/express-http2 具有所有 Express 类型,但假设底层核心为 http2,那么我认为这些都不一定。但我找不到这样的东西。

我认识到这是一个棘手的打字问题,因为据我所知,所有 Express 打字都是在假设 http 作为底层服务层的情况下编写的。据我了解,Express 本身适用于 http2,但问题是打字工作不干净。

我错过了什么吗?

附: - 我更喜欢 Express,但如果有另一个基于 Node 的 Web 框架更好地支持 http2 和 TypeScript 的组合,我也可以考虑。

【问题讨论】:

    标签: node.js typescript express http2


    【解决方案1】:

    我发现的一种方法是使用fastify。它们并不完全支持http2,但它们允许访问底层的原始请求对象。因此,当您启用http2 支持时,访问fastify 请求的raw 元素会返回一个http2.Http2ServerRequest

    从 TypeScript 的角度来看,最好的部分是它们已经定义了类型,这样当您将配置选项传递给 fastify 时,它会识别何时设置了 http2 标志并调整返回类型。这样,它是完全类型安全的(不需要强制转换为 any 并返回)。

    目前,如果您想要 http2 并输入安全性,fastify 似乎是一种合理的选择。不过我还没有在生产中使用它,所以我不能保证它的稳定性或性能。

    【讨论】:

      【解决方案2】:

      这行不通。在内部express 使用http 模块。

      您可以按照您的方式进行转换,但是您通过将其转换为 any 然后再次转换为 http2.Http2ServerRequest 而最终它不是 http2.Http2ServerRequest,这在某种程度上是在进行黑客攻击。

      http2 有一个公开的 PR 支持:https://github.com/expressjs/express/pull/3390

      【讨论】:

        猜你喜欢
        • 2015-08-29
        • 2020-10-14
        • 2021-01-29
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-04
        • 2020-12-17
        相关资源
        最近更新 更多