【问题标题】:Node.js & Redis get key dataNode.js 和 Redis 获取关键数据
【发布时间】:2017-06-14 02:09:18
【问题描述】:

我阅读了很多关于这个问题的信息,但我无法解决它。我正在使用 node.js 和 redis 中的代码从密钥中获取数据。当然,当我执行 client.get 时,由于异步,它会将数据打印为 nul 或 undefined。但是不知道怎么解决。

示例代码:这部分工作正常

     pubsub.on('psubscribe', function() {
            while(i<end){
                client.set( i , url, function() {
                });
                client.expire( i , 10);
                   console.log("New key: " + i);
                i++;
                }
    });

然后,当密钥过期时,我想获取数据以在 Redis 中重新设置:

    pubsub.on('pmessage', function(channel, message) {
        var keyData;
        client.get(message, function(err,data){
          keyData = data;
        });
        client.set( message , keyData, function(){});
        client.expire( message , 10);

    });

当然,数据是空的。

我该如何解决?

非常感谢。

【问题讨论】:

  • 你到底想做什么?如果设置过期时间,redis中的数据会过期吗?你为什么要得到它?您可以很好地将数据存储在程序中的某个位置并重新设置
  • @DKG 基本上他在 client.set 中将 keyData 设为 null,因为回调尚未到达 :)

标签: node.js asynchronous redis


【解决方案1】:

问题是因为节点本质上是异步的。这里有一些可以帮助你的东西。

client.get(message,(err,data)=>{
  client.set( message , data,()=>{
    client.expire( message , 10);
  });
});

话虽如此,这是一个糟糕的实现,会导致callback hell。使用 Promise 的更好的实现是

var clientGet = (message)=>{
  return new Promise((fullfill,reject)=>{
    client.get(message,(err,data)=>{
      if(err)
        reject(err);
      else
        fullfill([message,data]);
    });
  });
}


var clientSet = (dataFromGet)=>{
  return new Promise((fullfill,reject)=>{
    let message,data = dataFromGet;
    client.set(message,data,()=>{
      fullfill(message);
    });
  });
}


var clientExpire = (message)=>{
  return new Promise((fullfill,reject)=>{
    client.expire(message,10);
    fullfill();
  });
}

你可以调用他们使用

clientGet(message)
  .then(clientSet)
  .then(clientExpire)
  .then(()=>{
    console.log("All operations were fine");
  })
  .catch((ex)=>{
    console.err(ex.message);
  });

为什么不使用第一种方法

正如我之前写的那样,它会导致callback hell 这基本上是彼此内部的很多回调。从代码的第一部分可以看出,有两个函数,它们可能会增加,通常会使代码更难管理和阅读。

【讨论】:

  • 嗨,georoot,我试了一下,它返回了下一个错误:All operations were fine node_redis: Deprecated: The EXPIRE command contains a "undefined" argument. This is converted to a "undefined" string now and will return an error from v.3.0 on. Please handle this in your code to make sure everything works as you intended it to. 似乎再次未定义。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
相关资源
最近更新 更多