【问题标题】:Using redis and node.js issue: why does redis.get return false?使用 redis 和 node.js 问题:为什么 redis.get 返回 false?
【发布时间】:2022-02-06 14:30:18
【问题描述】:

我正在运行一个由 node.js 支持的简单 Web 应用程序,并且我正在尝试使用 redis 来存储一些键值对。我所做的只是在命令行上运行“node index.js”,这是我的 index.js 的前几行:

var app = require('express').createServer();
var io = require('socket.io').listen(app);

var redis = require('redis');
var redis_client = redis.createClient();
redis_client.set("hello", "world");
console.log(redis_client.get("hello"));

但是,我得到redis_client.get("hello") 而不是"world" 的只是false。为什么不返回"world"

(我正在运行 redis-server)

奇怪的是,here 发布的示例代码运行良好,并产生了预期的输出。对于简单的setget,我做错了什么吗?

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

    我敢打赌 get 是异步的,所以你可以通过回调来获取值。

    编辑:
    真的是异步的:file.js

    【讨论】:

      【解决方案2】:

      给你!对于 ES6

      redis_client.get("hello", (err, data)=>{
        if(err){
          throw err;
        }
        console.log(data);
      });
      

      对于 ES5

      redis_client.get("hello", function(err, data){
        if(err){
          throw err;
        }
        console.log(data);
      });
      

      【讨论】:

        【解决方案3】:

        这可能会对讨厌使用回调的人有所帮助:

        只需承诺它,而不必通过执行以下操作来使用外部库:

        new Promise((resolve, reject) => {
          redis_client.get("hello", (e, data) => {
            if(e){
              reject(e);
            }
            resolve(data);
          });
        });
        

        【讨论】:

          【解决方案4】:

          如今,Redis 使用 Promise API。

          const redis = require("redis"); // 4.0.1
          const redisClient = redis.createClient();
          
          (async () => {
            await redisClient.connect();
            await redisClient.set("hello", "world");
            console.log(await redisClient.get("hello")); // => world
            await redisClient.quit();
          })();
          

          【讨论】:

            【解决方案5】:

            遇到了同样的问题,用promisify解决了。

            const redis = require('redis');
            const util = require('util');
            const redisUrl ="redis://127.0.0.1:6379";
            const client = redis.createClient(redisUrl);
            
            client.set = util.promisify(client.set)
            
            client.get = util.promisify(client.get);
            
            
            const setRed =async ()=>{
                await client.set('name','Jo');
                let name = await client.get('name');
            //prints the value for name
                console.log(name);
            }
            
            setRed();
            
            

            【讨论】:

            • 改用这个 client.get('foo_rand000000000000', (error, data) => {return res.status(200).send(data)})
            猜你喜欢
            • 1970-01-01
            • 2020-05-03
            • 1970-01-01
            • 2015-02-22
            • 2013-09-18
            • 2014-11-17
            • 2014-03-11
            • 2019-07-12
            相关资源
            最近更新 更多