我正在研究http2
上的nodejs
,但发现问题pushStream
方法不起作用
(client side do not show "Pushed/[fileName]" on developer tool)
我想知道原因是否是nodejs版本(我安装了最新版本v9.8.0)
我的代码如下:
server.js
'use strict'
const fs = require('fs');
const path = require('path');
const http2 = require('http2');
const utils = require('./utils');
const { HTTP2_HEADER_PATH } = http2.constants;
const PORT = process.env.PORT || 3000;
// The files are pushed to stream here
function push(stream, path) {
const file = utils.getFile(path);
if (!file) {
return;
}
stream.pushStream({ [HTTP2_HEADER_PATH]: path}, (err, pushStream, headers) => {
if (err) throw err;
pushStream.respondWithFD(file.content, file.headers)
});
}
// Request handler
function onRequest(req, res) {
const reqPath = req.headers[':path'] === '/' ? '/index.html' : req.headers[':path']
const file = utils.getFile(reqPath);
// 404 - File not found
if (!file) {
res.statusCode = 404;
res.end();
return;
}
// Push with index.html
if (reqPath === '/index.html') {
push(res.stream, '/assets/main.js');
push(res.stream, '/assets/style.css');
} else {
console.log("requiring non index.html")
}
// Serve file
res.stream.respondWithFD(file.content, file.headers);
}
// creating an http2 server
const server = http2.createSecureServer({
cert: fs.readFileSync(path.join(__dirname, '/certificate.crt')),
key: fs.readFileSync(path.join(__dirname, '/privateKey.key'))
}, onRequest);
// start listening
server.listen(PORT, (err) => {
if (err) {
console.error(err);
return -1;
}
console.log(`Server listening to port ${PORT}`);
});
utils.js
'use strict';
const fs = require('fs');
const mime = require('mime');
module.exports = {
getFile: function (path) {
const filePath = `${__dirname}/public${path}`;
try {
const content = fs.openSync(filePath, 'r');
const contentType = mime.getType(filePath);
return {
content,
headers: {
'content-type': contentType
}
};
} catch (e) {
return null;
}
}
}
更新2020 01 28
已解决:原因是chrome v65的最新版本。有错误,导致客户端不信任PUSH_PROMISE
框架。我备份了chrome v64,然后就可以使用了。
我尚未尝试运行您的代码,但已注意到Chrome不允许使用不受信任的HTTPS证书(例如尚未添加到信任存储区的自签名证书)进行HTTP / 2推送。 Raised a bug with the Chrome team。
如果您有红色的不安全挂锁物品,那么您也可能遇到此问题。将证书添加到您的信任库中,重新启动Chrome并重新加载您应该获得绿色挂锁的网站。
注意,Chrome浏览器需要具有与域匹配的主题备用名称(SAN)字段的证书,因此,如果您只有较旧的主题字段,即使将其添加到信任库中,它也不会变成绿色。
另一个选择是通过在URL中键入以下内容来查看Chrome HTTP2框架:
chrome://net- internals/#http2
[如果看到推送承诺帧(带有promised_stream_id
),然后是该promised_stream_id
上的标头和数据,那么您知道服务器端正在工作。