从JavaScript对象创build一个Node.js可读stream – 最简单的方法

任何人都可以解释为什么我得到一个错误后运行节点v0.10.21下面的代码?

我意识到,我可以JSON.stringify()该对象,以实现或多或less相同的结果,这里的意义是要有意义的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); 

rs是一个objectModestream,但是process.stdout不是,所以期望将Buffer实例写入它。 由于它获得了错误的数据types,所以会引发错误。

如果你想能够像这样pipe道对象,你需要有一个中间stream,支持书写作为对象和阅读缓冲区。

像这样的东西:

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

正如loganfsmyth所指出的, rs是在objectMode ,而process.stdout则不是。 所以期望有Buffer s / String写到它,并且在得到一个Object时抛出一个TypeError

我们需要将对象stream转换为文本,这就是JSONStream所要做的:

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

我是一个对Node不太了解的人(我只需要让我的Gulp设置工作)。 因此,我需要20多行代码和stream.push(null)来处理stream中的variables这样的奇怪调用,这似乎有点疯狂。

这对我工作:

 var data = { "prop1": "val1", "prop2": "val2" }; var dest = 'path/to/dest/config.json'; var s = require('stream'); var stream = new s.Readable(); stream.push(JSON.stringify(data)); // stream apparently does not accept objects stream.push(null); // no idea why this is needed, but it is return stream .pipe() // whatever you need .pipe($.fs.createWriteStream(dest));