You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis v4.6.7中db.sadd不是函数?Express示例运行报错求助

问题描述

我尝试运行Express官方仓库中的search示例,已执行npm update,根目录package.json中Redis版本为"redis": "^4.6.7",但运行时出现以下错误:

$ node index.js
/home/vboxuser/src/nr/express/examples/search/index.js:28
db.sadd('ferret', 'tobi');
   ^

TypeError: db.sadd is not a function
    at Object.<anonymous> (/home/vboxuser/src/nr/express/examples/search/index.js:28:4)
    at Module._compile (node:internal/modules/cjs/loader:1218:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1272:10)
    at Module.load (node:internal/modules/cjs/loader:1081:32)
    at Module._load (node:internal/modules/cjs/loader:922:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47

Node.js v18.13.0

我在Redis仓库中搜索sadd未找到函数定义,请问问题原因是什么?该如何进一步调试?


问题原因及解决方案

核心原因

Redis Node.js客户端v4版本对API做了彻底重构:

  1. 废弃了v3及更早版本的直接回调式命令调用(如db.sadd()),全部改为Promise风格的异步方法。
  2. 命令命名改为驼峰格式,原Redis服务端命令sadd对应客户端方法为db.sAdd()。
  3. 你在Redis服务端仓库搜sadd找不到是正常的——sadd是Redis服务端的命令,你使用的Node.js客户端方法定义在Node.js Redis客户端仓库中,而非Redis服务端仓库。

调试与修复步骤

  • 适配v4 API修改代码:将原示例中的db.sadd('ferret', 'tobi')改为await db.sAdd('ferret', 'tobi'),同时要把这段代码放在async函数中,因为v4方法返回Promise,需要用await处理。
  • 修正客户端初始化逻辑:v4版本需要显式调用connect()建立连接,原示例的初始化代码可能是旧版本写法,需更新为:
    import { createClient } from 'redis';
    
    const db = createClient();
    db.on('error', err => console.error('Redis连接错误:', err));
    await db.connect(); // 必须显式执行连接
    
  • 调试客户端对象:在报错代码前添加console.log(Object.keys(db)),打印客户端对象的可用方法,确认sAdd是否存在,同时检查Redis服务是否正常启动、连接参数是否正确。
  • 临时降级方案:如果不想修改代码,可以将package.json中的Redis版本改为"redis": "^3.1.2",执行npm install后即可兼容原示例的旧API写法。

内容的提问来源于stack exchange,提问作者notaorb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:02:33