【问题标题】:Creating node http2 server, not getting a response in browser创建节点 http2 服务器,在浏览器中没有得到响应
【发布时间】:2016-04-05 05:35:54
【问题描述】:

我正在尝试为我的应用程序创建一个基于 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');

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

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”并记录它看到请求并创建推送流,但从从浏览器的角度来看,请求永远不会完成。

我怀疑我在最后一次router.use() 调用中没有正确使用serveStatic,但我真的看不出这种用法和从serverStatic 自述文件中复制的“组件”的使用有什么区别。

谁能指出我解决这个问题的方向,因为我似乎无法向前迈出任何一步。

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

似乎发生的是,此管道活动在发出结束事件之前就终止了。我目前的怀疑是使用完成模块过早触发并关闭流 - 但这可能是我在完成时说坏话,因为我不明白。

【问题讨论】:

    标签: node.js http2


    【解决方案1】:

    http2 的 https.ServerResponse 等价于 OutgoingResponse

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 2021-02-07
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      相关资源
      最近更新 更多