2011-12-15 17 views
2

node.jsのストリームを完全に理解しています。書き込み可能なストリームを作成すると、ストリームオブジェクトをRedisのJSON形式で保存して後でアクセスし、JSON.parseの後に書き込むことができますか?Node.js - 書き込み可能なストリームをRedisのJSONとして保存できますか?

例:

var fs = require('fs'); 
var redis = require('redis'); 

var streamName = fs.createWriteStream(upfilePath, streamopts); 
streamName = JSON.stringify(streamName); 

rclient.set('streamJSON', streamName); 

.... 

var myNewdata = 'whatever'; 
rclient.get('streamJSON', function (err, streamJSON) { 
    var recoveredStream = JSON.parse(streamJSON); 

    recoveredStream.write(myNewdata, function (err, written, buffer) { 
     //write successful?? 
    } 
} 

答えて

2

あなたはRedisの上の変数の参照を格納することはできません。ファイル名を保存してから、データを追加できるようにaフラグを付けてストリームを再度開くだけで済みます。

これはかなり興味深い質問だと思って、ストリームの状態を保存して後で使用できるようにするためにこれを作成しました。しかし、ちょうどaフラグを使うことができるのであれば、私はその点を見ません。しかし、ReadableStreamsの役に立つかもしれません。

var fs = require('fs'); 

exports.stringify = function(stream) { 
    var obj = { 
     path: stream.path 
    , writable: stream.writable 
    , fd: stream.fd 
    , options: { 
     encoding: stream.encoding 
     , mode: stream.mode 
    } 
    }; 

    if (stream.writable) { 
    obj.bytesWritten = stream.bytesWritten; 

    } else { 
    obj.options.bufferSize = stream.bufferSize; 
    obj.bytesRead = stream.bytesRead; 
    } 

    return JSON.stringify(obj); 
}; 

exports.parse = function(json, callback) { 
    var obj = JSON.parse(json); 
    var stream; 

    if (obj.writable) { 
    obj.options.flags = 'a'; 
    stream = fs.createWriteStream(obj.path, obj.options); 
    stream.bytesWritten = obj.bytesWritten; 


    } else { 
    stream = fs.createReadStream(obj.path, obj.options); 
    stream.bytesRead = obj.bytesRead; 
    } 

    // if stream was already opened, wait until it is 
    if (obj.fd !== null) { 
    stream.on('open', function() { 
     callback(null, stream); 
    }); 
    } else { 
    process.nextTick(function() { 
     callback(null, stream); 
    }); 
    } 

    return stream; 
}; 
+0

私ははるかに簡単なアプローチを提供してくれてありがとう。今すぐそれに取り組む! – agentOOjoe

+0

うわー、私のアプリは現在完全に動作しています。私の見解は、同じコードを何時間も見つめていたので、とても混乱していました。あなたのご意見をもう一度お寄せいただきありがとうございます。 – agentOOjoe

関連する問題