Node.js - Могу ли я хранить записываемые потоки как JSON в Redis? - PullRequest
3 голосов
/ 16 декабря 2011

Я все еще работаю над полным пониманием потоков в node.js.Если я создаю поток для записи, смогу ли я сохранить объект потока как JSON в Redis, а затем получить к нему доступ позже и продолжить запись в него (после JSON.parse)?*

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??
   }
}

1 Ответ

3 голосов
/ 16 декабря 2011

Нельзя хранить ссылки на переменные в 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;
};
...