从JavaScript对象创建Node.js可读流 - 最简单的方法

时间:2014-01-14 21:49:14

标签: javascript node.js stream

任何人都可以解释为什么在使用节点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

代码:

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);

3 个答案:

答案 0 :(得分:18)

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);

答案 1 :(得分:4)

正如loganfsmyth所说,rs位于objectMode,而process.stdout不是。{1}}。因此,期望将Buffer s / String写入其中,并在获得TypeError时抛出Object

我们需要将对象流转换为文本,这是JSONStream要做的事情:

JSONStream = require('JSONStream');
rs.pipe(JSONStream.stringify()).pipe(process.stdout);

答案 2 :(得分:1)

我是一个对Node不太了解的人(我只需要让我的Gulp设置工作)。因此,我需要20多行代码和奇怪的调用(如sf::Music来处理流中的变量这一事实似乎有点疯狂。

这对我有用:

stream.push(null)