Nodejs中redis的lrange命令返回值问题

Nodejs中redis的lrange命令返回值问题

用下列代码,显示undefined,为什么呢 想实现对读出的data进行from,to,msg的控制,怎么修改

var redis = require(‘redis’); rc = redis.createClient(); rc.on(‘error’, function (err) { console.log('Redis error ’ + err); }); var from = ‘sdd’; var to = ‘wmh’; var Str = {from:from, to:to,msg:“hello”};

for (var i = 0, len = 4; i < len; i++) { rc.rpush(‘test:case’,Str); }

rc.lrange(‘test:case’, 0, -1, function (err, data) { console.log(data.from); rc.end(); });


4 回复

在Node.js中使用Redis时,lrange命令用于获取列表中指定范围内的元素。然而,在你的代码中,你直接尝试访问data.from,这是不正确的,因为lrange返回的是一个数组,而不是一个对象。

示例代码与解释

让我们首先修复代码,以便正确地从Redis中获取并处理数据:

const redis = require('redis');
const client = redis.createClient();

client.on('error', function(err) {
    console.error('Redis error:', err);
});

// 准备一些测试数据
const from = 'sdd';
const to = 'wmh';
const Str = {from: from, to: to, msg: "hello"};

// 将数据推入Redis列表
for (let i = 0; i < 4; i++) {
    client.rpush('test:case', JSON.stringify(Str)); // 注意这里需要将对象转换为字符串
}

// 获取列表中的所有数据,并解析它们
client.lrange('test:case', 0, -1, function(err, replies) {
    if (err) {
        console.error('Error:', err);
        return;
    }

    // 遍历每个回复,并解析为JSON对象
    replies.forEach(function(reply) {
        const data = JSON.parse(reply);
        console.log(`From: ${data.from}, To: ${data.to}, Message: ${data.msg}`);
    });

    // 关闭客户端连接
    client.quit();
});

解释

  1. 字符串化对象:由于Redis存储的数据必须是字符串形式,因此我们在向列表中添加数据之前,需要先将对象转换为字符串(使用JSON.stringify())。

  2. 处理返回值lrange命令返回一个数组,其中包含列表中的所有元素。这些元素仍然是字符串形式,所以我们需要使用JSON.parse()将其转换回JavaScript对象。

  3. 遍历结果:我们可以遍历lrange返回的数组,并对每个元素执行所需的逻辑操作(例如打印from, to, 和 msg字段)。

通过这种方式,你可以正确地从Redis中读取数据,并根据需要处理这些数据。


就我所知,redis的list类型只支持string,但Str很明显是Object。要按这个需求做,只能通过JSON作encode/decode。 保存:rc.rpush('test:case',JSON.stringify(Str));
取出:console.log(JSON.parse(data).from);

嫌JSON麻烦,非要以Object来保存Str,可以考虑redis的hash类型,但要达到同样的效果就不是一个回帖的篇幅能摆平的了。

谢谢提醒。不过用console.log(JSON.parse(data).from);进行取出时出现语法错误

从你的描述来看,问题出在对 lrange 命令返回值的处理上。lrange 命令返回的是一个数组,其中包含指定范围内的所有元素。你需要访问数组中的具体元素,然后解析该元素,而不是直接访问 data.from

你可以先将 data 数组中的字符串元素解析为 JSON 对象,然后再访问其属性。这里提供了一个修改后的示例代码:

var redis = require('redis');
var rc = redis.createClient();

rc.on('error', function (err) {
    console.log('Redis error ' + err);
});

var from = 'sdd';
var to = 'wmh';
var Str = {from: from, to: to, msg: "hello"};

for (var i = 0; i < 4; i++) {
    rc.rpush('test:case', JSON.stringify(Str));
}

rc.lrange('test:case', 0, -1, function (err, data) {
    if (err) {
        console.error(err);
        return;
    }
    
    data.forEach(function (item) {
        var parsedData = JSON.parse(item);
        console.log(parsedData.from, parsedData.to, parsedData.msg);
    });

    rc.end();
});

在这个示例中:

  • 使用 JSON.stringify() 将对象转换为字符串,然后将其存储到 Redis 中。
  • 在获取数据时,使用 JSON.parse() 解析字符串为 JSON 对象。
  • 最后遍历数组并打印每个对象的属性。

这样就可以正确地获取并处理 lrange 命令返回的数据。

回到顶部