2016-01-01 2 views
3

Я играю с NodeJS и WebSockets, есть upgrade event с его параметром голова, как я понял из here, что в основном data that directly trails the headers, но для моего случая использования это всегда пустой, так что я не действительно знаю, что это значит, я был бы рад, если бы кто-то мог предоставить простой пример использования, когда параметр данных в событии обновления не пуст.NodeJS, WebSockets, реконструкция головы

ответ

1

Глядя на the source, излучающий это событие обновления в репо узла, вы увидите следующую реализацию:

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, отражает данные из переданного параметра d на функцию socketOnData , который является стандартным сокетом data обработчиком событий. С другой стороны, это может быть undefined, если onParserExecuteCommon был вызван от onParserExecute. Мне нужно будет изучить источник больше, чтобы понять, какие случаи будут применяться в зависимости от того, как ваш сервер реализован. Возможно, вы можете включить журналы отладки, чтобы узнать, какие методы вызывают.

+0

Я думаю, что вы сделали более чем достаточно, спасибо. –

Смежные вопросы