创建节点http2服务器,而不是在浏览器中获取响应

时间:2015-12-31 08:01:23

标签: node.js http2

我正在尝试为我的应用程序创建基于nodejs的http2服务器。但是当我收到请求时,我无法获得第一个基础并提供index.html。

我有一个数字模块(web.js)需要我认为我需要的东西(其中一些用于我用...取代的服务器部分

var fs = require('fs');
var path = require('path');
var enableDestroy = require('server-destroy');
var PROJECT_ROOT = path.resolve(__dirname, '..');
var Router = require('router');
var emitter = require('events').EventEmitter;
var util = require('util');
var jwt = require('jwt-simple');
var finalhandler = require('finalhandler');
var semiver = require('semver');
var logger = require('./log');
var router = Router();
var component = Router();
var api = Router();
var serveStatic = require('serve-static');
var bodyParser = require('body-parser');

然后是一个简单的函数来创建服务器并执行路由。该功能的内容是(abbrieviated)

emitter.call(this);
util.inherits(web,emitter);
this.server = require('http2').createServer(cert);
this.server.on('request',(req,res) => {
  var done = finalhandler(req,res);
  if(req.url === '/' || req.url === '/index.html') {
    if(res.push) { //check for support
      logger('debug','creating a push stream');
      var favicon = res.push('/favicon.ico');
      favicon.writeHead(200);
      fs.createReadStream(path.join(PROJECT_ROOT,'app','favicon.ico')).pipe(favicon);
    }
  }
  logger('debug','server request received for ' + req.url );
  router(req,res,done);
});
this.server.listen(PORT,hostname);
enableDestroy(this.server); //enhance server with ability to shut it down

router.use('/components/',component);


component.use(serveStatic(path.resolve(PROJECT_ROOT,'app/elements')));
component.use(serveStatic(path.resolve(PROJECT_ROOT,'bower_components')));
router.route('/logon').all(bodyParser.json()).post((req,res) => {
...
});
router.use('/api/',api);
api.use(bodyParser.json());
api.post('/api',(req, res, next) => {
...
});
router.use('/', serveStatic(path.resolve(PROJECT_ROOT,'app')));
logger('debug','server ready for use');

简单的日志记录功能显示服务器可以使用,然后我可以请求“/”或“/index.html”并记录它看到了请求并且它正在创建推送流,但是从浏览器透视,请求永远不会完成。

我怀疑我在上一次serveStatic调用中没有正确使用router.use(),但我真的看不出这种用法和使用“server”从serverStatic复制的任何区别自述。

任何人都可以指出我的方向来解决这个问题,因为我似乎无法向前迈进一步。

编辑:我一直在调试发生的事情,据我所知,serve-static正常工作,并发送index.html以响应url'/'。 serve-static使用“send”模块将index.html的内容传递给响应对象。

似乎发生的事情是此管道活动在发出结束事件之前死亡。我现在的怀疑是,使用完成后的模块会过早地开火并关闭流 - 但这可能是我不好意思地完成,因为我不理解它。

1 个答案:

答案 0 :(得分:0)

http2相当于https.ServerResponseOutgoingResponse

但它缺少布尔finished字段。完成后的模块使用它来确定它是传入或传出消息以及它是否已完成。它得到一个未定义的值,因此立即(我认为下一个时钟滴答)表示流已完成。

我已将finished字段修补到OutgoingReponse,现在似乎可以正常工作。

我还在github存储库上留下了一个问题。

编辑:此问题已得到认可,现已纳入最新版本。