我正在尝试为我的应用程序创建基于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的内容传递给响应对象。似乎发生的事情是此管道活动在发出结束事件之前死亡。我现在的怀疑是,使用完成后的模块会过早地开火并关闭流 - 但这可能是我不好意思地完成,因为我不理解它。
答案 0 :(得分:0)
http2相当于https.ServerResponse
是OutgoingResponse
。
但它缺少布尔finished
字段。完成后的模块使用它来确定它是传入或传出消息以及它是否已完成。它得到一个未定义的值,因此立即(我认为下一个时钟滴答)表示流已完成。
我已将finished
字段修补到OutgoingReponse
,现在似乎可以正常工作。
我还在github存储库上留下了一个问题。
编辑:此问题已得到认可,现已纳入最新版本。