Node.js使用redis模块连接Redis实例出现挂起及语法错误问题
问题分析与解决
核心问题
你的代码存在两个关键问题:
- 执行顺序错误:
client.set('key', 'value')在Redis连接建立前就同步执行了。(async() => { await client.connect(); })()是异步立即执行函数,不会阻塞后续代码,导致set操作在连接完成前触发,自然无法写入数据。 - await使用场景错误:直接给
client.set加await时,这行代码不在async函数内部(CommonJS默认不支持顶级await),因此触发语法错误。
修复方案
把所有需要在连接建立后执行的Redis操作,放到连接成功的async函数内部,确保执行顺序正确;如果不需要长期保持连接,操作完成后主动关闭客户端可避免程序挂起。
修改后的代码:
const redis = require('redis'); const client = redis.createClient(); client.on('error', (error) => { console.error('Error encountered: ', error); }); (async() => { await client.connect(); // 连接建立后执行set操作,用await确保操作完成 await client.set('key', 'value'); console.log('数据写入成功'); // 操作完成后关闭客户端,避免程序挂起 await client.disconnect(); })();
补充说明
- 如果你的项目是ES模块(package.json中
type设为module),可直接使用顶级await,写法更简洁:
import redis from 'redis'; const client = redis.createClient(); client.on('error', (error) => { console.error('Error encountered: ', error); }); await client.connect(); await client.set('key', 'value'); await client.disconnect();
- 若需要长期保持Redis连接(比如服务端持续处理请求),不要调用
disconnect,但要确保所有Redis操作都在连接建立后执行。
内容的提问来源于stack exchange,提问作者Caleb Renfroe
相关产品推荐
相关产品推荐

