n37*_*370 15 javascript stream node.js
任何人都可以解释为什么我在使用节点v0.10.21运行以下代码后出现错误?
我知道我可以JSON.stringify()那个对象以获得或多或少相同的结果,这里的要点是理解stream.Readable当objectMode设置为true时.
错误:
net.js:612
throw new TypeError('invalid data');
^
TypeError: invalid data
at WriteStream.Socket.write (net.js:612:11)
at write (_stream_readable.js:583:24)
at flow (_stream_readable.js:592:7)
at _stream_readable.js:560:7
at process._tickCallback (node.js:415:13)
at Function.Module.runMain (module.js:499:11)
at startup (node.js:119:16)
at node.js:901:3
Run Code Online (Sandbox Code Playgroud)
代码:
var stream = require('stream');
var edad = require(__dirname + '/public/edad.json');
var rs = new stream.Readable({ objectMode: true });
rs.push(edad);
rs.push(null);
rs.pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)
log*_*yth 19
rs
是一个objectMode流,但process.stdout
不是,所以它期望将Buffer
实例写入其中.由于它获取了错误的数据类型,因此会抛出错误.
如果您希望能够像这样管道对象,则需要一个支持写入对象和读取为缓冲区的中间流.
像这样的东西:
var stream = require('stream');
var util = require('util');
function StringifyStream(){
stream.Transform.call(this);
this._readableState.objectMode = false;
this._writableState.objectMode = true;
}
util.inherits(StringifyStream, stream.Transform);
StringifyStream.prototype._transform = function(obj, encoding, cb){
this.push(JSON.stringify(obj));
cb();
};
var edad = require(__dirname + '/public/edad.json');
var rs = new stream.Readable({ objectMode: true });
rs.push(edad);
rs.push(null);
rs.pipe(new StringifyStream()).pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20276 次 |
最近记录: |