Sam*_*r83 18 redis node.js node-redis
我试图在redis中保存二进制对象,然后将其作为图像提供.
这是我用来保存数据的代码:
var buff=new Buffer(data.data,'base64');
client.set(key,new Buffer(data.data,'base64'));
Run Code Online (Sandbox Code Playgroud)
以下是转储数据的代码:
client.get(key,function(err,reply){
var data = reply;
response.writeHead(200, {"Content-Type": "image/png"});
response.end(data,'binary');
});
Run Code Online (Sandbox Code Playgroud)
数据的前几个字节似乎已损坏.神奇的数字不正确.
做了一些试验:
当我做以下事情时:
var buff=new Buffer(data.data,'base64');
console.log(buff.toString('binary'));
Run Code Online (Sandbox Code Playgroud)
我明白了:
0000000:c289 504e 470d 0a1a 0a00 0000 0d49 4844
当我这样做
var buff=new Buffer(data.data,'base64');
console.log(buff);
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
缓冲液89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00
我不确定c2来自哪里
mb.*_*mb. 21
问题是Redis Client for Node默认情况下会将响应转换为JavaScript字符串.
我通过在创建客户端时设置return_buffers选项来解决这个问题true.
var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true});
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参见此处
我遇到了类似的问题,就我而言,问题在于我如何将数据从 Redis 获取到 Nodejs。在我的例子中,来自 Nodejs 的值被正确存储,但是当它进入 Node 时,它被转换为 ASCII 字符串。我能够使用以下行将其强制到缓冲区。
let file = await r.get(redis.commandOptions({ returnBuffers: true }), `zip/${req.params.taskId}`)
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何存储二进制字符串。
这是我的解决方法:
其中data是base64字符串中的数据
client.set(count,data);
Run Code Online (Sandbox Code Playgroud)
提供数据:
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);
});
Run Code Online (Sandbox Code Playgroud)
这并不理想,因为您每次都必须进行转换,但它似乎有效。
| 归档时间: |
|
| 查看次数: |
10815 次 |
| 最近记录: |