创建节点 http2 服务器,在浏览器中没有得到响应
Creating node http2 server, not getting a response in browser
我正在尝试为我的应用程序创建一个基于 nodejs 的 http2 服务器。但目前我无法到达一垒并在收到请求时发球 index.html。
我有一个模块 (web.js),它需要我认为我需要的东西(其中一些用于我已替换为 ...
[=15 的服务器部分) =]
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
,但我真的看不出这种用法和 "component" 的用法有什么区别从服务器静态自述文件复制。
任何人都可以指出解决此问题的方向,因为我似乎无法向前迈出任何一步。
编辑:我一直在调试正在发生的事情,据我所知,serve-static 正在做它的工作,并发送 index.html 作为响应 url '/'。 serve-static 使用 "send" 模块将 index.html 的内容通过管道传递给响应对象。
似乎发生的是这个管道 activity 在发出结束事件之前就死了。我目前怀疑是使用 on-finished 模块过早触发并关闭了流 - 但这可能是我对 on-finished 的不满意,因为我不明白它。
http2 等同于 https.ServerResponse
是 OutgoingResponse
.
但是它缺少布尔值 finished
字段。 on-finished 模块使用它来确定它是传入消息还是传出消息以及是否完成。它得到一个未定义的值,结果立即(我认为是下一个时钟滴答)表示流已完成。
我已将 finished
字段修补到 OutgoingReponse
中,现在它似乎可以工作了。
我还在 github 存储库中留下了一个问题。
编辑:此问题已被识别并已合并到最新版本中。
我正在尝试为我的应用程序创建一个基于 nodejs 的 http2 服务器。但目前我无法到达一垒并在收到请求时发球 index.html。
我有一个模块 (web.js),它需要我认为我需要的东西(其中一些用于我已替换为 ...
[=15 的服务器部分) =]
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
,但我真的看不出这种用法和 "component" 的用法有什么区别从服务器静态自述文件复制。
任何人都可以指出解决此问题的方向,因为我似乎无法向前迈出任何一步。
编辑:我一直在调试正在发生的事情,据我所知,serve-static 正在做它的工作,并发送 index.html 作为响应 url '/'。 serve-static 使用 "send" 模块将 index.html 的内容通过管道传递给响应对象。
似乎发生的是这个管道 activity 在发出结束事件之前就死了。我目前怀疑是使用 on-finished 模块过早触发并关闭了流 - 但这可能是我对 on-finished 的不满意,因为我不明白它。
http2 等同于 https.ServerResponse
是 OutgoingResponse
.
但是它缺少布尔值 finished
字段。 on-finished 模块使用它来确定它是传入消息还是传出消息以及是否完成。它得到一个未定义的值,结果立即(我认为是下一个时钟滴答)表示流已完成。
我已将 finished
字段修补到 OutgoingReponse
中,现在它似乎可以工作了。
我还在 github 存储库中留下了一个问题。
编辑:此问题已被识别并已合并到最新版本中。