web-dev-qa-db-fra.com

serveur node.js et HTTP/2 (2.0) avec express.js

Est-il possible actuellement d’obtenir un serveur node.js HTTP/2 (HTTP 2.0)? Et la version http 2.0 de express.js?

39
WHITECOLOR

Si vous utilisez express@^5 et http2@^3.3.4, la méthode correcte pour démarrer le serveur est la suivante:

const http2 = require('http2');
const express = require('express');

const app = express();

// app.use('/', ..);

http2
    .raw
    .createServer(app)
    .listen(8000, (err) => {
        if (err) {
            throw new Error(err);
        }

        /* eslint-disable no-console */
        console.log('Listening on port: ' + argv.port + '.');
        /* eslint-enable no-console */
    });

Notez le https2.raw. Cela est nécessaire si vous souhaitez accepter les connexions TCP.

Notez qu'au moment de la rédaction de ce document (2016 05/06), aucun des principaux navigateurs ne prend en charge HTTP2 sur TCP .

Si vous souhaitez accepter les connexions TCP et TLS, vous devez démarrer le serveur à l'aide de la méthode par défaut createServer:

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


const app = express();

// app.use('/', ..);

http2
    .createServer({
        key: fs.readFileSync('./localhost.key'),
        cert: fs.readFileSync('./localhost.crt')
    }, app)
    .listen(8000, (err) => {
        if (err) {
            throw new Error(err);
        }

        /* eslint-disable no-console */
        console.log('Listening on port: ' + argv.port + '.');
        /* eslint-enable no-console */
    });

Notez qu'au moment d'écrire ces lignes, j'ai réussi à utiliser express et http2 (voir https://github.com/molnarg/node-http2/issues/100#issuecomment-217417055 ). Cependant, j'ai réussi à faire fonctionner http2 (et SPDY) avec spdy package.

const spdy = require('spdy');
const express = require('express');
const path = require('path');
const fs = require('fs'); 

const app = express();

app.get('/', (req, res) => {
    res.json({foo: 'test'});
});

spdy
    .createServer({
        key: fs.readFileSync(path.resolve(__dirname, './localhost.key')),
        cert: fs.readFileSync(path.resolve(__dirname, './localhost.crt'))
    }, app)
    .listen(8000, (err) => {
        if (err) {
            throw new Error(err);
        }

        /* eslint-disable no-console */
        console.log('Listening on port: ' + argv.port + '.');
        /* eslint-enable no-console */
    });
12
Gajus
var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('hello, http2!');
});

var options = {
  key: fs.readFileSync('./example/localhost.key'),
  cert: fs.readFileSync('./example/localhost.crt')
};

require('http2').createServer(options, app).listen(8080);

MODIFIER

Cet extrait de code provient d'une d'une conversation sur Github.

26
HDK

Ce problème est toujours d'actualité (plus d'un an plus tard) et j'ai donc décidé de tenter de contourner le problème pour que les paquets express et http2 fonctionnent bien ensemble ..__ J'ai créé un paquet npm qui fait exactement cela: https://www.npmjs.com/package/express-http2-workaround

Installer via NPM: npm install express-http2-workaround --save

// Require Modules
var fs = require('fs');
var express = require('express');
var http = require('http');
var http2 = require('http2');

// Create Express Application
var app = express();

// Make HTTP2 work with Express (this must be before any other middleware)
require('express-http2-workaround')({ express:express, http2:http2, app:app });

// Setup HTTP/1.x Server
var httpServer = http.Server(app);
httpServer.listen(80,function(){
  console.log("Express HTTP/1 server started");
});

// Setup HTTP/2 Server
var httpsOptions = {
    'key' : fs.readFileSync(__dirname + '/keys/ssl.key'),
    'cert' : fs.readFileSync(__dirname + '/keys/ssl.crt'),
    'ca' : fs.readFileSync(__dirname + '/keys/ssl.crt')
};
var http2Server = http2.createServer(httpsOptions,app);
http2Server.listen(443,function(){
  console.log("Express HTTP/2 server started");
});

// Serve some content
app.get('/', function(req,res){
    res.send('Hello World! Via HTTP '+req.httpVersion);
});

Le code ci-dessus est une application express fonctionnelle qui utilise à la fois le module http nodejs (pour HTTP/1.x) et le module http2 (pour HTTP/2).

Comme indiqué dans le fichier readme, cela crée de nouveaux objets de requête et de réponse express et définit leurs prototypes sur les objets IncomingMessage et ServerResponse de http2. Par défaut, il s'agit des objets http IncomingMessage et ServerResponse intégrés au noeud nodejs.

J'espère que ça aide :)

0
JSenpai