55

現在、node.js HTTP/2 (HTTP 2.0) サーバーを取得することは可能ですか? そして、express.js の http 2.0 バージョンは?

4

4 に答える 4

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

編集

このコード スニペットは、Github での会話から取られたものです。

于 2015-03-02T07:54:26.093 に答える
26

と を使用している場合express@^5http2@^3.3.4サーバーを起動する正しい方法は次のとおりです。

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

に注意してhttps2.rawください。これは、TCP 接続を受け入れる場合に必要です。

この記事の執筆時点 (2016 年 5 月 6 日) では、主要なブラウザはいずれも HTTP2 over TCP をサポートしていないことに注意してください。

TCP および TLS 接続を受け入れたい場合は、デフォルトの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 */
    });

この記事を書いている時点で、私はなんとか作成expresshttp2て動作していたことに注意してください ( https://github.com/molnarg/node-http2/issues/100#issuecomment-217417055を参照)。spdyただし、パッケージを使用して http2 (および SPDY) を動作させることができました。

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 */
    });
于 2016-05-06T10:56:12.560 に答える
1

この問題は現在も (これを書いている時点で 2016 年) 残っているため、express と http2 パッケージをうまく連携させるための回避策を試してみることにしました: https://www.npmjs.com/package/express-http2 -回避策

編集:ネイティブの「http2」モジュールにより、v8.4 より上の NodeJS バージョンでは機能しません。

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

上記のコードは、nodejs http モジュール (HTTP/1.x 用) と http2 モジュール (HTTP/2 用) の両方を使用する実用的な Express アプリケーションです。

readme に記載されているように、これにより、新しいエクスプレス リクエストおよびレスポンス オブジェクトが作成され、それらのプロトタイプが http2 の IncomingMessage および ServerResponse オブジェクトに設定されます。デフォルトでは、組み込みの nodejs http IncomingMessage および ServerResponse オブジェクトです。

これが役立つことを願っています:)

于 2016-11-13T06:26:46.370 に答える