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

时间:2019-12-30 17:36:08

标签: node.js express http2

我正在使用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, err => {
    if (err) throw err;
})

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

  

[nodemon] 2.0.2 [nodemon]要随时重新启动,请输入rs [nodemon]   观看目录: [nodemon]观看扩展:js,mjs,json   [nodemon]开始node index.js   _http_incoming.js:96,如果(this.socket。可读)                     ^

     

TypeError:无法读取未定义的属性“可读”       在IncomingMessage._read(_http_incoming.js:96:19)       在IncomingMessage.Readable.read(_stream_visible.js:491:10)       在resume_(_stream_read.js:976:12)       在processTicksAndRejections(internal / process / task_queues.js:80:21)[nodemon]应用崩溃-   等待文件更改,然后再开始...

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

1 个答案:

答案 0 :(得分:10)

expressjs仍不正式支持节点http2

enter image description here

For more details visit here

但是您可以使用node-spdy。使用此模块,您可以在具有自然http模块界面并回退到常规https(对于尚不支持HTTP2或SPDY的浏览器)的node.js中创建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 + '.')
        }
      })

有关spdyvisit here的更多数据。

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