2015-02-20 12 views

Antwort

10

genommen wurde Wenn Sie [email protected]^5 und [email protected]^3.3.4 verwenden, dann der richtige Weg, um den Server zu starten ist:

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 die https2.raw. This is required if you want to accept TCP connections.

Beachten Sie, dass zum Zeitpunkt dieses Schreibens (2016 05 06), none of the major browsers support HTTP2 over TCP.

Wenn Sie TCP und TLS-Verbindungen akzeptieren, dann müssen Sie den Server starten Sie den Standard createServer Methode:

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 zum Zeitpunkt des Schreibens dieses Artikels habe ich verwalten express zu machen und http2 zu arbeiten (siehe https://github.com/molnarg/node-http2/issues/100#issuecomment-217417055). Jedoch habe ich geschafft, http2 (und SPDY) zu arbeiten, mit spdy Paket.

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

Interessanterweise erhalte ich diesen Fehler und https://github.com/expressjs/express/issues/2761#issuecomment-216912022. (node) warning: Möglich EventEmitter Speicherleck erkannt. 11 Fehlerlistener hinzugefügt. Verwenden Sie emitter.setMaxListeners(), um das Limit zu erhöhen. – zmanc

25
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

Dieser Code-Schnipsel aus a conversation on Github.

+9

FYI Dies funktioniert nicht mit 'express @ 4.13.3' und' http2 @ 3.2.0', und es sieht so aus, als ob es express nicht unterstützt v5. https://github.com/molnarg/node-http2/issues/100 –

+0

Es funktioniert nicht mit 'node @ v6.7.0',' express @ 5.0.0-alpha.2', '[email protected] 6'. _TypeError: dest.end ist keine Funktion_ – neoDev

0

Dieses Problem ist heute noch da (über ein Jahr später), so entschied ich mich zu machen, eine Abhilfe einen gehen zu müssen ausdrücklich zu machen und http2 Pakete gut zusammen arbeiten. Ich habe ein npm Paket erstellt, die genau das tut: https://www.npmjs.com/package/express-http2-workaround

über NPM installieren: npm installieren Express-http2-Umgehung --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 ein funktionierendes Express-Anwendung, die beide verwendet die Knoten http-Modul (für HTTP/1.x) und das http2-Modul (für HTTP/2).

Wie in der Readme erwähnt, erstellt dies neue Express-Request- und Response-Objekte und setzt ihre Prototypen auf die IncomingMessage- und ServerResponse-Objekte von http2. Standardmäßig sind dies die integrierten HTTP-Objekte IncomingMessage und ServerResponse von nodejs.

ich hoffe das hilft :)

Verwandte Themen