Как сохранить двоичный объект в redis с помощью node?

Я пытаюсь сохранить двоичный объект в redis, а затем возвращать его в качестве изображения.

Вот код, который я использую для сохранения данных:

var buff=new Buffer(data.data,'base64');
client.set(key,new Buffer(data.data,'base64'));

Вот код для выгрузки данных:

client.get(key,function(err,reply){
        var data = reply;
        response.writeHead(200, {"Content-Type": "image/png"});
        response.end(data,'binary');

});

Первые несколько байтов данных кажутся поврежденными. Магическое число неверно.

Сделал некоторые эксперименты:

когда я делаю следующее:

var buff=new Buffer(data.data,'base64');
console.log(buff.toString('binary'));

Я получаю это:

0000000: c289 504e 470d 0a1a 0a00 0000 0d49 4844

когда я это делаю

 var buff=new Buffer(data.data,'base64');
 console.log(buff);

Я получаю следующее:

Буфер 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00

Я не уверен, где c2 исходит из

Ответ 1

Проблема заключается в том, что клиент Redis для Node по умолчанию преобразует ответы на строки JavaScript.

Я решил это, установив параметр return_buffers в true при создании клиента.

var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true});

Подробнее см. здесь.

Ответ 2

Мне не удалось выяснить, как получить двоичную строку для хранения.

Вот мой способ:

Где данные - это данные в строке base64

client.set(count,data);

для обслуживания данных:

 client.get(last,function(err,reply){
   var data = reply;
   response.writeHead(200, {"Content-Type": "image/png"});
   var buff=new Buffer(data,'base64');
   response.end(buff);
});

Это не идеально, потому что вы должны делать конверсию каждый раз, но, похоже, это работает.

Ответ 3

Проблема с return_buffers заключается в том, когда вы не используете данные чистого буфера, тогда вам нужно будет что-то сделать, чтобы преобразовать другие буферы в строки. Хотя detect_buffers может быть вариантом, это слишком ненадежно.

Если вы не возражаете против дополнительных вычислительных циклов. Вы также можете попробовать:

// convert your buffer to hex string
client.set(key, mybuffer.toString('hex'));
// create a new buffer from hex string
client.get(key, function (err, val) {
   var bin = new Buffer(val, 'hex');
});

Ответ 4

Что сработало для меня, это использовать data.toString('binary'), если это Buffer. Также не переучивайте его как utf-8, но также как binary.