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