json - Node.js - 我可以在 Redis 中将可写流存储为 JSON 吗?

标签 json node.js stream redis

我仍在致力于全面理解 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??
   }
}

最佳答案

你不能在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;
};

关于json - Node.js - 我可以在 Redis 中将可写流存储为 JSON 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528115/

相关文章:

php - 如何对 $GLOBALS 进行 json_encode?

stream - Liquidsoap 不会重新加载播放列表文件

http - 如何通过HTTP处理大文件而不将请求存储在临时文件中

dart - 为什么BroadcastStream在Dart中不是一种类型?

Python AUTH0 发布请求 : Invalid request payload JSON format

arrays - MongoDB 中的唯一索引

java - 如何从 Android map Activity 中的 url 获取 JSON 数据

node.js - 如何在 Mongoose 中按子文档字段对记录进行分组?

javascript - Nestjs/cqrs - 类型错误 : Cannot read property 'values' of undefined on install

node.js - 使用 node-soap 的简单网络服务