2014-01-14 7 views
9

ノードv0.10.21で次のコードを実行した後にエラーが発生する理由を説明できる人はいますか?JavaScriptオブジェクトから読み込み可能なストリームNode.jsを作成する - 可能な限り簡単な方法

私は、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); 
+0

を::

これは私のために働いた同様の状況に関する別の質問に答えを書きました。リンク:(http://stackoverflow.com/a/35886734/1453339) – johnshumon

答えて

17

rsは、オブジェクトモードストリームですが、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); 
+0

とにかく私はまだそのオブジェクトを正しくstringifingしていますか?この男とそれを文字列にする仕事を残して、目的地にオブジェクトをダンプする方法はありますか? – n370

+0

@ n370わかりません。あなたが 'rs'を返すだけでそれが得られます。 'rs'を文字列を期待するストリームに直接パイプすることはできません。あなたは確かにオブジェクトを受け入れるためにそれを宛先ストリームに残すことができます。 – loganfsmyth

+0

ああ私はそれを得た!ここのケースでは、 'process.stdout'は' stdout'への出力前にオブジェクトを文字列に変更することを期待していますか?私たちは純粋なノードとJSでそれを作ることができますか?私は本当にあなたの注意を感謝します。@loganfsmyth – n370

3

をloganfsmythが指摘したように、process.stdoutがない間rsは、objectModeです。だから、Buffer s/Stringが書かれており、ObjectになるとTypeErrorが投げられています。

我々は JSONStreamが行うことに作られているものである、テキストにオブジェクトのストリームを変換する必要があり

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

私はノードについて多くを知らない人です、私はちょうど私のがぶ飲みを持っている必要があります(セットアップ作業)。そのため、ストリーム内で変数を扱うには、コード数が20行以上で、stream.push(null)のような奇妙な呼び出しが必要であるという事実は少し狂っているようです。さらに読者のため

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)); 
関連する問題