2015-06-13 7 views
0
$ node --version 
v0.10.29 

Подобно "Cannot switch to old mode now" - Node.JS apn module error in tls.connect function я получаю «Не удается переключиться на старый режим в настоящее время», когда паузы читаемый поток (в данном случае ответ HTTP/IncomingMessage)Как приостановить nodejs текущий поток, когда полностью заполняется

ошибка брошенной
_stream_readable.js:732 
    throw new Error('Cannot switch to old mode now.'); 
     ^
Error: Cannot switch to old mode now. 
    at emitDataEvents (_stream_readable.js:732:11) 
    at IncomingMessage.Readable.pause (_stream_readable.js:723:3) 

В IncomingMessage есть XML в теле, в котором я подключаюсь к обработчику sax-js. Затем обработчик записывает вывод в поток PassThrough, который отправляется по каналу в какой-либо пункт назначения. Чтение docs по readable.pause() и readable.resume() Я не уверен, что я делаю неправильно. Есть ли что-то о потоках, которые мне не хватает, или я использую неправильный шаблон ниже?

function wrapStream(incoming) { 
    var dest = new PassThrough(); 
    dest.setEncoding("utf8"); 

    dest.on("drain", function() { 
    incoming.resume(); 
    }); 

    var saxStream = sax.createStream(true, {}); 

    saxStream.print = function() { 
    var args = Array.prototype.slice.apply(arguments); 

    /* 
    * It's my understanding that if the dest stream is full, 
    * we should pause the IncomingMessage 
    * until the dest drains. 
    */ 
    if (!dest.write.apply(dest, args)) { 
     // throws error here. 
     incoming.pause(); 
    } 
    }; 

    /* 
    * Attach handlers to saxStream here. 
    * They use the print() function to write data to dest. 
    */ 

    saxStream.on("end", function() { 
    dest.end(); 
    }); 

    incoming.pipe(saxStream); 

    return dest; 
} 

var output = fs.createWriteStream("/tmp/test.xml"); 

http.get(url, function(res) { 
    var saxStream = wrapStream(res); 

    saxStream.pipe(output); 
}); 

ответ

0

Потоки встраивают механизм под названием противодавление. Транспортировка потока в другой автоматически заботится о том, когда поток назначения занят. Если вы используете старые потоки (узел 0.8), но я предполагаю, что это не так.

Вы должны делать только req.pipe(saxStream).

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