Node.js无法从Redis获取数据,存/取操作无回调输出求助
问题原因及解决方案
你的代码问题出在 Redis 客户端版本的 API 不兼容以及命令调用方式错误:
核心问题
- Redis v4+ API 变更:你使用的
redis包是 v4 及以上版本,该版本已弃用传统的回调式命令调用,转而默认使用 Promise 语法。因此你传入的set和get回调函数不会被执行,导致没有控制台输出。 createClient参数错误:v4 版本的createClient不再接受位置参数(主机、端口),而是需要传入配置对象。
修复步骤
1. 修正客户端初始化
将 createClient 的位置参数改为配置对象:
redisClient = redis.createClient({ host: '127.0.0.1', port: 6379 });
2. 使用 Promise/Async-Await 替代回调
由于 v4 版本默认返回 Promise,你可以选择以下两种方式执行命令:
方式一:使用 .then()/.catch()
// 保存数据 redisClient.set('Region', 'Asia') .then(reply => console.log(reply)) .catch(err => console.log('error', err)); // 获取数据 redisClient.get('Region') .then(reply => console.log(reply)) .catch(err => console.log('error', err));
方式二:使用 Async-Await(更推荐)
将命令放在 async 函数中:
async function runRedisCommands() { try { // 等待连接完成(可选,v4 会自动连接) await redisClient.connect(); console.log('Connected to Redis'); // 保存数据 const setReply = await redisClient.set('Region', 'Asia'); console.log(setReply); // 获取数据 const getReply = await redisClient.get('Region'); console.log(getReply); } catch (err) { console.log('Error', err); } } runRedisCommands();
3. 可选:启用回调兼容(不推荐)
如果你坚持使用回调,可以启用 legacy 模式,但这是临时兼容方案,不建议长期使用:
const redis = require('redis'); const { createClient } = redis; const redisClient = createClient({ host: '127.0.0.1', port: 6379, legacyMode: true // 启用回调兼容 }); redisClient.connect(); redisClient.on('error', err => console.log('Error ' + err)); redisClient.on('connect', () => console.log('Connected to Redis')); // 现在回调可以正常工作 redisClient.set('Region', 'Asia', (err, reply) => { if (err) console.log('error', err); else console.log(reply); }); redisClient.get('Region', (err, reply) => { if (err) console.log('error', err); else console.log(reply); });
额外说明
- Redis v4+ 支持自动连接,即使你不调用
redisClient.connect(),执行命令时也会自动建立连接。 - 建议优先使用 Async-Await 语法,代码更简洁易读,且符合现代 JavaScript 异步编程规范。
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

