Node.js项目接入Redis报ClientClosedError、hset不存在报错排查
Node.js 项目 Redis 客户端异常问题解决方案
核心原因
所有异常和使用yarn安装依赖无关,本质是参考教程基于Redis Node.js客户端v3及更早版本编写,本地安装的是v4+大版本,两个大版本存在不兼容的破坏性API变更。
各异常对应说明
Uncaught ClientClosedError: The client is closed报错
v3及更早版本客户端在实例创建时会自动建立连接,无需手动触发连接操作;v4+版本取消了自动连接逻辑,必须手动执行client.connect()完成连接初始化,添加该调用的修复方式是正确的。- 未决议Promise异常
v3版本客户端所有命令默认是回调风格,不需要处理Promise;v4+版本所有命令原生返回Promise,必须通过await或者.then()接收执行结果,否则会抛出未捕获的Promise异常,给set操作加await的修复方式是正确的。 Uncaught TypeError: client.hset is not a function报错
属于v4版本API调整导致的兼容问题:- 命名规则变更:多单词命令在v4中统一改为小驼峰命名,哈希写入操作的方法名是
hSet,部分v4小版本直接移除了全小写hset的别名 - 传参规则变更:v3版本支持
hset(key, field, value)的三参数写法,v4版本的hSet仅支持两种传参格式:传入对象批量设置字段、传入平铺键值对的数组设置字段
- 命名规则变更:多单词命令在v4中统一改为小驼峰命名,哈希写入操作的方法名是
v4+版本正确使用示例
const { createClient } = require('redis'); // 初始化客户端,默认连接本地127.0.0.1:6379,自定义地址、端口、密码可在传入的配置对象中声明 const client = createClient(); // 全局监听连接错误,避免异常直接导致进程崩溃 client.on('error', (err) => console.error('Redis连接异常:', err)); async function runRedisOps() { // 手动建立连接 await client.connect(); // String类型操作 await client.set('hi', 'there'); const strVal = await client.get('hi'); console.log(strVal); // 输出: there // Hash类型操作 await client.hSet('german', { red: 'rot' }); // 对象传参批量写入 // 等价单字段写入写法:await client.hSet('german', ['red', 'rot']) const hashVal = await client.hGetAll('german'); console.log(hashVal); // 输出: { red: 'rot' } } runRedisOps();
兼容旧写法方案
如果不想修改按照旧教程编写的代码,可以直接安装v3稳定版客户端,安装完成后旧写法可直接运行无需调整:
yarn add redis@3.1.2
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

