【问题标题】:redis client and node js - hgetall method fails with empty resultsredis客户端和节点js-hgetall方法失败,结果为空
【发布时间】:2017-01-20 08:28:47
【问题描述】:

这是我使用 redis cilent 和 node js 的第一天。

我正在尝试复制我通过 node.js 中的 redis-cli 运行的这个命令:

127.0.0.1:6379> HGETALL widgets:9145090003_00:00_00:00
1) "id"
2) "33305"
3) "loc"
4) "jamaica"
5) "days"
6) ""

这是nodejs代码:

client.hgetall("widgets:9145090003_00:00_00:00", function (err, replies) {
        console.log(err);
        replies.forEach(function (reply,i) {
                console.log('  ' + i + ':' + reply);
        }); 
});

它返回 null,然后在尝试执行 foreach 时失败。

我也试过了:

 client.hgetall("widgets", function (err, replies) {
            console.log(err);
            replies.forEach(function (reply,i) {
                    console.log('  ' + i + ':' + reply);
            }); 
    });

但我得到了相同的结果。

不知道我做错了什么。

编辑 1

我试过这个代码:

 17 console.log("attempting to do hgetall..");
 18 client.hgetall("widgets:9145090003_00:00_00:00", function (err, replies) {
 19         //for (let k in replies) console.log(' ${k}:${replies[k]}');
 20         console.log(replies.id);
 21 });

结果如下:

/var/www/html/node/test/models/Widgets.js:20
    console.log(replies.id);
                       ^

TypeError: Cannot read property 'id' of null

然而,在 CLI 中我可以这样做:

127.0.0.1:6379> HGET widgets:9145090003_00:00_00:00 id
"33305"
127.0.0.1:6379> HGETALL widgets:9145090003_00:00_00:00
1) "id"
2) "33305"
3) "loc"
4) "jamaica"
5) "days"
6) ""
127.0.0.1:6379> 

【问题讨论】:

    标签: javascript node.js redis redis-cli redisclient


    【解决方案1】:

    hgetall 的回复是 Object 类型,尝试在代码中添加以下行

    console.log(replies.id);
    

    您将在控制台中打印 33305。

    【讨论】:

    • console.log(replies) 打印什么?
    • 返回 null。
    • client.hgetall("widgets:9145090003_00:00_00:00",redis.print) 并且说“回复:null”
    • 尝试添加client=redis.createClient('6379','127.0.0.1');如果您还没有,也可以尝试在节点服务器运行时查看 redis 中的客户端列表,检查是否可以正常连接
    【解决方案2】:

    我试图复制你正在做的事情。我会首先检查您是否连接到正确的 redis 实例。如果是,问题是 forEach 函数适用于数组,但这里的回复是一个对象,并且没有 Object.prototype.forEach 函数。您将不得不以不同的方式循环响应。如果您连接到正确的 redis 实例,我已经重新编写了您的代码。

    client.hgetall("widgets:9145090003_00:00_00:00", function (err, replies) {
            console.log(replies);
            for(let k  in replies) {
               console.log(` ${k}:${replies[k]}`);
            }
    });
    

    【讨论】:

    • 我应该在哪里检查redis客户端中的这个特定方法是否返回一个对象?只是要求将来参考以帮助自己。这是我一直在使用的参考资料……非常有限:npmjs.com/package/redis
    • 顺便说一句,我尝试了这段代码,但它什么也没返回。没有错误,但没有打印。
    • 您似乎连接不正确。我认为您应该阅读this before proceeding,它会告诉您如何连接到您的 redis 实例正在侦听的端口。至于知道函数返回什么,我认为您应该查看 redis 本身的文档。在这里,由于您正在调用 hgetall,因此您将返回一个哈希,该哈希将转换为 javascript 中的对象
    【解决方案3】:

    对于使用async/await 的开发者: 不要忘记在从 Redis 返回值的方法之前添加await,否则您将得到一个空数组/集合。

    例子:

     await this.client.zRange('test_queue', '0', '100')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-05
      • 2017-01-19
      • 2020-11-22
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2017-08-27
      相关资源
      最近更新 更多