簡體   English   中英

NodeJS,WebSockets,升級頭

[英]NodeJS, WebSockets, upgrade head

我正在玩NodeJS和WebSockets,有一個帶有head參數的升級事件 ,正如我從這里理解的那樣,基本上data that directly trails the headers ,但對於我的用例,它總是空的,所以我真的不知道是什么這意味着,如果有人能提供升級事件中的數據參數不為空的簡單用例,我會很高興。

查看在節點repo中發出該升級事件的源代碼 ,您將看到以下實現:

  function socketOnData(d) {
    assert(!socket._paused);
    debug('SERVER socketOnData %d', d.length);
    var ret = parser.execute(d);

    onParserExecuteCommon(ret, d);
  }

  function onParserExecute(ret, d) {
    debug('SERVER socketOnParserExecute %d', ret);
    onParserExecuteCommon(ret, undefined);
  }

  function onParserExecuteCommon(ret, d) {
    if (ret instanceof Error) {
      debug('parse error');
      socket.destroy(ret);
    } else if (parser.incoming && parser.incoming.upgrade) {
      // Upgrade or CONNECT
      var bytesParsed = ret;
      var req = parser.incoming;
      debug('SERVER upgrade or connect', req.method);

      if (!d)
        d = parser.getCurrentBuffer();

      socket.removeListener('data', socketOnData);
      socket.removeListener('end', socketOnEnd);
      socket.removeListener('close', serverSocketCloseListener);
      unconsume(parser, socket);
      parser.finish();
      freeParser(parser, req, null);
      parser = null;

      var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';
      if (EventEmitter.listenerCount(self, eventName) > 0) {
        debug('SERVER have listener for %s', eventName);
        var bodyHead = d.slice(bytesParsed, d.length);

        // TODO(isaacs): Need a way to reset a stream to fresh state
        // IE, not flowing, and not explicitly paused.
        socket._readableState.flowing = null;
        self.emit(eventName, req, socket, bodyHead);
...

傳遞的參數bodyHead反映了socketOnData函數上傳遞的參數d的數據,該函數是默認的套接字data事件處理程序。 另一方面,如果從onParserExecuteCommon調用onParserExecute ,則可能undefined 我必須更多地查看源代碼,以了解哪些情況適用,具體取決於服務器的實現方式。 也許您可以啟用調試日志以查看正在調用的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM