【发布时间】: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 的内容通过管道传送到响应对象。
似乎发生的是,此管道活动在发出结束事件之前就终止了。我目前的怀疑是使用完成模块过早触发并关闭流 - 但这可能是我在完成时说坏话,因为我不明白。
【问题讨论】: