使用 SPDY/http2 的快速应用程序中的套接字挂断

Posted

技术标签:

【中文标题】使用 SPDY/http2 的快速应用程序中的套接字挂断【英文标题】:Socket hang up in express app using SPDY/http2 【发布时间】:2016-04-24 09:40:15 【问题描述】:

我有一个 express 4 应用程序,我正在尝试实现 http2/SPDY。

www(创建服务器的地方):

var spdy         = require('spdy');

var options = 
    /* certs */


var server = spdy.createServer(options,app).listen(8081);

index.js:

var asset        = fs.readFileSync("public/js/asset.js");

router.get('/test', function(req,res) 

    if (req.isSpdy) 
        var headers = 'content-type': 'application/javascript';
        res.push('/js/asset.js', headers, function(err,stream) 
            if (err) 
                console.log(err);
                return;
            
            stream.end(asset);
        );
    
    res.render('test', ); 
);

现在这一切都在正常使用场景中完美运行。使用SPDY indicator plugin 我可以看到我的网站是通过 HTTP/2 提供的。我还可以看到 PUSH_PROMISES 适用于指定的资产文件。它的性能提升真的非常棒。

但是,当请求被客户端中止时,就会出现问题。这很容易通过在浏览器中快速按下刷新/停止来复制。在这种情况下,我收到以下错误,导致我的节点应用程序崩溃:

events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: socket hang up
    at TLSSocket.onclose (/Users/colevarner/fullpower/node/motionxlive/node_modules/spdy/node_modules/spdy-transport/lib/spdy-transport/connection.js:186:15)
    at TLSSocket.g (events.js:260:16)
    at emitOne (events.js:82:20)
    at TLSSocket.emit (events.js:169:7)
    at Immediate._onImmediate (net.js:469:12)
    at processImmediate [as _immediateCallback] (timers.js:374:17)

如果我注释掉 res.push() 调用,代码将按预期工作,没有错误。

我尝试了npm spdy-push 包装模块(声明它处理连接关闭),但它根本不起作用。像文档显示的那样设置时,会导致以下错误:

/Users/colevarner/fullpower/node/motionxlive/node_modules/spdy/node_modules/spdy-transport/lib/spdy-transport/stream.js:662
  return callback(err, push);
         ^

TypeError: callback is not a function
    at /Users/colevarner/fullpower/node/motionxlive/node_modules/spdy/node_modules/spdy-transport/lib/spdy-transport/stream.js:662:14
    at /Users/colevarner/fullpower/node/motionxlive/node_modules/spdy/node_modules/spdy-transport/lib/spdy-transport/connection.js:833:5
    at Object.callback (/Users/colevarner/fullpower/node/motionxlive/node_modules/spdy/node_modules/spdy-transport/lib/spdy-transport/stream.js:463:5)
    at Framer.tickSync (/Users/colevarner/fullpower/node/motionxlive/node_modules/spdy/node_modules/spdy-transport/lib/spdy-transport/protocol/base/scheduler.js:130:12)
    at Framer.tick (/Users/colevarner/fullpower/node/motionxlive/node_modules/spdy/node_modules/spdy-transport/lib/spdy-transport/protocol/base/scheduler.js:108:13)
    at /Users/colevarner/fullpower/node/motionxlive/node_modules/spdy/node_modules/spdy-transport/lib/spdy-transport/protocol/base/scheduler.js:102:10
    at doNTCallback0 (node.js:407:9)
    at process._tickCallback (node.js:336:13)

是否有人对我可能做错的地方、我应该如何处理中止的请求或另一个为 Express 提供 http2/spdy PUSH_PROMISE 支持的模块有任何想法?

【问题讨论】:

【参考方案1】:

在与npm-spdy 的开发人员交谈后,它似乎目前已损坏。

【讨论】:

以上是关于使用 SPDY/http2 的快速应用程序中的套接字挂断的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 chrome 从 gRPC 服务器获取日期

通过 C 中的套接字快速接收不同长度数据包的连续流?

在 PHP 中进行 TELNET 的正确且快速的方法。套接字或 cURL

带有快速会话的 ReactJS 和 socket.io - 套接字未使用正确的会话并创建了许多其他会话

OkHttp学习 - POM 文件

OkHttp学习 - POM 文件