【发布时间】:2016-03-07 02:45:55
【问题描述】:
我正在使用节点模块 spdy 实现 HTTP2/SPDY 推送资源。我已经关注indutny's doc 并一直在进行测试运行,将他的示例实现到我的 server.js 中。
问题有两个方面; 我没有在日志中看到任何错误,也没有在浏览器中看到alert。我也没有在开发者控制台中看到任何变化。如果我设置了一个虚假的推送 URL,我不会收到任何响应/错误等。我相信理论上,优先级应该从medium 变为High(?)。 See Screen shoot.
我是否有另一种方法可以测试是否正在向浏览器进行推送?或者,我的脚本是否有问题(请检查不一致)?另外,stream.on('error', function() {}); 中要扔什么?
在 Chrome 中测试(在 ChromeBook 上)、nodejs v5.1.0、npm v3.3.12 - H2 已在 Chrome 中验证。
server.js:
var environment = '../env/' + process.env.NODE_ENV
// Process User config
, fS = require('fs')
, jsonFile = fS.readFileSync(environment + '/config.json')
, jsonString, hostIp, hostPort, cacheExp, cps;
try {
jsonString = JSON.parse(jsonFile);
var SERV_HOST = jsonString['hostIp']
, SERV_PORT = jsonString['hostPort']
, CACHE_EXP = jsonString['cacheExp']
, CPS = jsonString['cps']
, xPowerBy = 'OceanPress'
, xFrameOptions = 'DENY'
, xXSSProtection = '1; mode=block'
, xContentTypeOption = 'nosniff';
} catch (err) {
console.log('There is an error parsing the json file : ' + err);
}
// Load modules
var fs = require('fs')
, watch = require('staticsmith-watch')
, buffet = require('buffet')({root: environment + '/_public'})
, spdy = require('spdy')
// spdy options
, options = {
key: fs.readFileSync(environment + '/keys/key.pem')
, cert: fs.readFileSync(environment + '/keys/cert.pem')
// SPDY-specific options
, spdy: {
protocols: [ 'h2','spdy/3.1', 'spdy/3', 'spdy/2','http/1.1', 'http/1.0' ]
, plain: false
, maxStreams: 200
, connection: {
windowSize: 1024 * 1024
, autoSpdy31: false
}
}
// Set ip and port
, host: SERV_HOST
, port: SERV_PORT
}
// Security header options
, security = [
{ name: 'X-Powered-By',
option: xPowerBy }
, { name: 'x-frame-options',
option: xFrameOptions }
, { name: 'X-XSS-Protection',
option: xXSSProtection }
, { name: 'X-Content-Type-Options',
option: xContentTypeOption }
, { name: 'Cache-Control',
option: CACHE_EXP }
, { name: 'Content-Security-Policy',
option: CPS }
, { name: 'server',
option: 'Who knows' }
];
if (process.env.NODE_ENV == 'production') {
spdy.createServer(options, function(req, res) {
// Add Content Security Rules
for(var i = 0; i < security.length; i++) {
res.setHeader(security[i].name, security[i].option);
}
// @see https://www.npmjs.com/package/buffet
buffet(req, res, function (err, result) {
// Push JavaScript asset (main.js) to the client
var stream = res.push('/js/main.js', {
req: {'accept': '*/*'},
res: {'content-type': 'application/javascript'}
});
stream.on('acknowledge', function() {
console.log("Stream ACK");
});
stream.on('error', function() {
console.error("stream ERR");
});
stream.end('alert("hello from push stream!");');
// write main response body and terminate stream
res.end('<script src="/js/main.js"></script>');
// There was an error serving the file? Throw it!
if (err) {
console.error("Error serving " + req.url + " - " + err.message);
// Respond to the client
res.writeHead(err.status, err.headers);
}
});
}).listen(options.port, options.host);
console.log("serving at https://" + options.host + ":" + options.port);
console.log("On Node v" + process.versions.node);
console.log("On npm v" + process.versions.npm);
watch({
pattern: '**/*',
livereload: true,
});
}
更新: 我还添加了:
stream.on('acknowledge', function() {
console.log('stream ACK');
});
没有写入控制台日志 - 就像函数死了一样。
【问题讨论】:
-
在你的index.html中,你有
<script src="main.js">吗?浏览器将忽略推送的资源,否则它没有理由请求。 -
是的,我愿意。我尝试在文档中运行它,但应用程序失败了。
-
stream是否发出错误?至少,您应该注销错误事件。默默地吞下它们是一个很好的方式来射击自己的脚。 -
是的,我同意。因此问题;我不确定测试或在
stream.on('error', function() {});建议中抛出什么?谢谢。 -
我只是把
console.error(err)扔进去,这样你就可以看到它是不是stream发出了错误。
标签: node.js spdy http2 pushstream