Ist es derzeit möglich, node.js HTTP/2 (HTTP 2.0) -Server zu erhalten? Und http 2.0-Version von express.js?
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 */
});
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.
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 :)