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

前端之家收集整理的这篇文章主要介绍了从JavaScript对象创建一个Node.js可读的流 – 最简单的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
任何人都可以解释为什么在使用节点v0.10.21运行以下代码后会收到错误

我知道我可以JSON.stringify()该对象为了实现或多或少的相同的结果,这里的意义是在objectMode设置为true时对stream.Readable有意义.

错误

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是一个objectMode流,但是process.stdout不是,所以它期望写入Buffer实例.由于它的数据类型不正确,因此会导致错误.

如果您希望能够管理这样的对象,则需要具有支持以对象形式写入并以Buffers的形式读取的中间流.

这样的事情

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

猜你在找的JavaScript相关文章