【发布时间】:2015-08-29 05:34:57
【问题描述】:
$ node --version
v0.10.29
与"Cannot switch to old mode now" - Node.JS apn module error in tls.connect function 类似,我在暂停可读流(在本例中为 HTTP 响应/IncomingMessage)时抛出“无法切换到旧模式”错误
_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 流,该流通过管道传输到某个目的地。阅读readable.pause() 和readable.resume() 上的docs 我不确定我做错了什么。我是否缺少关于流动流的某些内容,或者我在下面实施了错误的模式?
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);
});
【问题讨论】: