如何使用 nodejs 模块 http2 将 http2 与 ExpressJS 集成?

Posted

技术标签:

【中文标题】如何使用 nodejs 模块 http2 将 http2 与 ExpressJS 集成?【英文标题】:How to integrate http2 with ExpressJS using nodejs module http2? 【发布时间】:2020-04-19 10:17:45 【问题描述】:

我正在使用 nodejs 和 express 创建一个 api,我想将 http2 与 ExpressJS 集成

这是我的代码:

'use strict';

const http2 = require('http2');
const fs = require('fs');
const path = require('path');

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const port = process.env.PORT || 443;

// Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: false ));

// Routes variables
const indexRouter = require('./routes/index');

// Routes uses
app.use('/', indexRouter);

// Server configurations
const key = path.join(__dirname + '/security/key.pem');
const cert = path.join(__dirname + '/security/certificate.pem');

const options = 
    key: fs.readFileSync(key),
    cert: fs.readFileSync(cert)


const server = http2.createSecureServer(options, app);

server.on('error', err => console.log(err));

server.listen(port, () => 
   console.log('Server running')
)

我正在尝试将快速服务器作为 createSecureServer() 的第二个参数传递,但我不确定我是否正确,因为我收到此错误:

[nodemon]2.0.2 [nodemon]随时重启,输入rs[nodemon] 观看目录:. [nodemon] 观看扩展:js,mjs,json [nodemon] 开始node index.js _http_incoming.js:96 if (this.socket.readable) ^

TypeError: 无法读取未定义的“可读”属性 在 IncomingMessage._read (_http_incoming.js:96:19) 在 IncomingMessage.Readable.read (stream_readable.js:491:10) 恢复时 (_stream_readable.js:976:12) 在 processTicksAndRejections (internal/process/task_queues.js:80:21) [nodemon] 应用程序崩溃 - 在开始之前等待文件更改...

应该注意,我的证书虽然是自签名的且不可靠,但可以正确加载。 如果我可以用 NodeJS 做到这一点,我尽量不使用第三方模块。有什么帮助吗?

【问题讨论】:

【参考方案1】:

expressjs 还没有正式支持 Node http2

For more details visit here

但你可以使用node-spdy。使用此模块,您可以在 node.js 中创建具有自然 http 模块接口的 HTTP2 / SPDY 服务器并回退到常规 https(对于既不支持 HTTP2 也不支持 SPDY 的浏览器)。

 const port = 3000
    const spdy = require('spdy')
    const express = require('express')
    const path = require('path')
    const fs = require('fs')
    
    const app = express()
    
    app.get('*', (req, res) => 
        res
          .status(200)
          .json(message: 'ok')
    )
    const options = 
        key: fs.readFileSync(__dirname + '/server.key'),
        cert:  fs.readFileSync(__dirname + '/server.crt')
    
    console.log(options)
    spdy
      .createServer(options, app)
      .listen(port, (error) => 
        if (error) 
          console.error(error)
          return process.exit(1)
         else 
          console.log('Listening on port: ' + port + '.')
        
      )

欲了解更多详情,请访问spdy、visit here。

如果您有其他框架的选项,您可以使用支持节点 http2'KOA''HAPI'。 This might be useful for you

另外,阅读这个Release 5.0#2237,上面写着:

Express 5 的目标是 API 调整和删除所有代码 从 Express 存储库中移至pillarjs 中的组件 项目(https://github.com/pillarjs),至少提供基本的 支持返回承诺的处理程序和完整的 HTTP/2 功能。 Express 5 将成为“对支柱的看法”,并将 是这些组件的排列。

【讨论】:

今天,你推荐我使用 nginx Proxy 绕过 Express 并使用 HTTP/2 吗?我正在使用 Kubernetes 的微服务架构。

以上是关于如何使用 nodejs 模块 http2 将 http2 与 ExpressJS 集成?的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js http2 模块的服务器发送事件 - 我应该如何将它与流 / pushStream 一起使用?

ExperimentalWarning:http2 模块是一个实验性 API

NodeJS 原生 http2 支持

Node js - http2 的捆绑器

nodejs环境下http2初尝试

基础 | 前端系列!nodejs环境下http2初尝试