2016-08-25 10 views
4

Я пытаюсь использовать HTTP/2. Мой экспресс версия 5.0.0-alpha.2, http2 версия 3.3.4.TypeError: dest.end не является функцией

Я полагаю, http2 должен work well with express 5.

const http2 = require('http2'); 
// const http2 = require('spdy'); // using spdy package here, everything works perfect 

const options = { 
    key: fs.readFileSync(path.join(__dirname, 'private', 'server.key')), 
    cert: fs.readFileSync(path.join(__dirname, 'private', 'server.crt')) 
}; 

const server = http2 
    .createServer(options, app) 
    .listen(3000, err => { 
    if (err) throw new Error(err); 

    // I can see "Listening..." message, which means the server starts running well. 
    console.log('Listening...'); 
    }); 

Сервер начинает работать хорошо, но когда я открываю сайт клиента, он дает мне эту ошибку в терминале:

_stream_readable.js:512 
    dest.end(); 
     ^

TypeError: dest.end is not a function 
    at Stream.onend (_stream_readable.js:512:10) 
    at Stream.g (events.js:286:16) 
    at emitNone (events.js:91:20) 
    at Stream.emit (events.js:185:7) 
    at endReadableNT (_stream_readable.js:975:12) 
    at _combinedTickCallback (internal/process/next_tick.js:74:11) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 
+0

https://github.com/molnarg/node-http2/issues/100 похоже, что spdy is dead – Joe

+0

@ Joe спасибо, сейчас я пытаюсь использовать пакет http2, но не смог. Вот откуда взялся этот вопрос. –

+0

Я думаю, что человек, отвечающий на вопрос, который вы говорите, означает, что для работы HTTP/2 вам нужно использовать модуль 'spdy', а не модуль' http2'. Я могу реплицировать ошибку, которую вы получаете, и она исчезает, когда я использую 'spdy.createServer (...)' вместо 'http2.createServer (...)'. – robertklep

ответ

2

Кажется node-http2 не поддерживается Экспресс еще. Просим отслеживать этот вопрос Support for module http на github.

В то же время вы можете остановиться с node-spdy.

const spdy = require('spdy'); 

const options = { 
    key: fs.readFileSync(path.join(__dirname, 'private', 'server.key')), 
    cert: fs.readFileSync(path.join(__dirname, 'private', 'server.crt')) 
}; 

const server = spdy 
    .createServer(options, app) 
    .listen(3000, err => { 
    if (err) throw new Error(err); 
    console.log('Listening...'); 
    }); 
1

С Express 5.0 мы имеем еще одно решение:

express = require('express'), //Web framework 

// Solution 
express.request.__proto__ = http2.IncomingMessage.prototype; 
express.response.__proto__ = http2.ServerResponse.prototype; 

// Create app for server http/2 
var apph2 = express(); 

И это код сервера:

var 
    application_root = __dirname, 
    express  = require('express'), //Web framework 
    http2  = require('http2') 
    logger  = require('morgan') 
    fs   = require('fs') 
    constants = require('constants'); 


// Bunyan logger 
var bunyan = require('bunyan'); 
var app = require('./apps/app_name'); 

var bunlog = bunyan.createLogger({name: "brqx_app"}); 


var credentials = { 
// log   : bunlog , 
    key   : fs.readFileSync('/etc/letsencrypt/live/domain/privkey.pem' ), 
    cert  : fs.readFileSync('/etc/letsencrypt/live/domain/fullchain.pem' ), 
    ca   : fs.readFileSync("/etc/letsencrypt/live/domain/chain.pem"  ), 
    dhparam  : fs.readFileSync("/etc/letsencrypt/archive/domain/dh1.pem" ), 
    secureOptions: constants.SSL_OP_NO_SSLv3 | constants.SSL_OP_NO_SSLv2 
}; 

// Configure server 

server = http2.createServer(credentials , app); 

server.listen(PORT , function() { 
    console.log('Started Brqx http/2!'); 
}) 

Я надеюсь, что эти простые линии помогает людям.

Одна вещь важна, когда мы ищем информацию в Интернете, является датой тестирования, когда код был протестирован: 2017 - октябрь.

С уважением.

Ricardo/Brqx.