0

我正在学习http2nodejs但发现一个问题pushStream方法不起作用

在此处输入图像描述 (客户端在开发者工具上不显示“Pushed/[fileName]”)

不知是不是nodejs版本的原因(我安装的是最新版本v9.8.0)

我的代码如下:

服务器.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}`);
});

实用程序.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,然后它现在可以工作了。

4

1 回答 1

1

我没有尝试运行您的代码,但注意到 Chrome 不允许使用不受信任的 HTTPS 证书(例如尚未添加到信任库的自签名证书)进行 HTTP/2 推送。向 Chrome 团队提出了一个错误

如果您有红色的不安全挂锁项目,那么您也可能遇到此问题。将证书添加到您的信任库中,重新启动 Chrome 并重新加载您应该获得绿色挂锁的站点。

注意 Chrome 需要具有与域匹配的主题备用名称 (SAN) 字段的证书,因此如果您刚刚获得较旧的主题字段,那么即使将其添加到您的信任库后,它也不会变为绿色。

另一种选择是通过在您的 URL 中输入以下内容来查看 Chrome HTTP2 帧:

chrome://net- internals/#http2

如果您看到推送承诺框架(带有promised_stream_id),然后是标题和数据,promised_stream_id那么您知道服务器端正在工作。

于 2018-03-22T23:01:22.080 回答