带有Node.js的服务器推送PushStream方法不起作用

问题描述 投票:0回答:1

我正在研究http2上的nodejs,但发现问题pushStream方法不起作用

enter image description here(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,然后就可以使用了。

node.js http2 server-push push-promise pushstream
1个回答
1
投票

我尚未尝试运行您的代码,但已注意到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上的标头和数据,那么您知道服务器端正在工作。

© www.soinside.com 2019 - 2024. All rights reserved.