wake-up-neo.net

node.js Server und HTTP/2 (2.0) mit express.js

Ist es derzeit möglich, node.js HTTP/2 (HTTP 2.0) -Server zu erhalten? Und http 2.0-Version von express.js?

39
WHITECOLOR

Wenn Sie [email protected]^5 und [email protected]^3.3.4 verwenden, können Sie den Server auf folgende Weise starten:

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 */
    });

Beachten Sie den https2.raw. Dies ist erforderlich, wenn Sie TCP -Verbindungen akzeptieren möchten.

Beachten Sie, dass zum Zeitpunkt dieses Schreibens (2016 05 06) keiner der großen Browser HTTP2 über TCP unterstützt.

Wenn Sie TCP - und TLS-Verbindungen akzeptieren möchten, müssen Sie den Server mit der Standardmethode createServer starten:

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 */
    });

Beachten Sie, dass es mir zum Zeitpunkt dieses Schreibens gelungen ist, express und http2 funktionieren zu lassen (siehe https://github.com/molnarg/node-http2/issues/100#issuecomment-217417055 ). Es ist mir jedoch gelungen, http2 (und SPDY) mithilfe von spdy zu verwenden.

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);

EDIT

Dieses Code-Snippet wurde aus einem Gespräch über Github übernommen.

26
HDK

Dieses Problem gibt es heute noch (über ein Jahr später), also habe ich beschlossen, einen Workaround zu machen, um Express und http2-Pakete gut zusammenarbeiten zu lassen. Ich habe ein npm-Paket erstellt, das genau das tut: https://www.npmjs.com/package/express-http2-workaround

Installation über 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);
});

Der obige Code ist eine funktionierende Express-Anwendung, die sowohl das http-Modul nodejs (für HTTP/1.x) als auch das http2-Modul (für HTTP/2) verwendet.

Wie in der Readme-Datei erwähnt, werden dadurch neue Express-Anfrage- und -Antwortobjekte erstellt und ihre Prototypen auf die IncomingMessage- und ServerResponse-Objekte von http2 festgelegt. Standardmäßig handelt es sich dabei um die eingebauten Nodejs-Objekte http IncomingMessage und ServerResponse.

Ich hoffe das hilft :)

0
JSenpai