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

使用node-redis检测Redis列表是否存在及client.exists失效问题排查

问题:Redis的exists命令无响应,无法检测列表是否存在

我想要通过访问根路由的路径创建自定义列表,用Express路由参数获取列表名称后,向其中添加预定义值。但需要先检查该列表名称是否未被Redis数据库中的其他列表占用,于是使用client.exists命令检测键(列表名称)是否存在,但这个命令完全不起作用。

我的代码如下:

app.get("/:customListName", (req, res) => {
  const customListName = req.params.customListName;
  console.log(customListName);

  client.exists(customListName, (err, reply) => {
    if (reply === 0) {
      console.log("Doesn't exist!");

      const multi = client.multi();
      const customList = ["Have fun!", "Play Games!", "Watch Movies!"];
      customList.forEach((item) => {
        multi.rPush(customListName, item);
      });
      multi.exec();
    } else {
      console.log("Exists!");
    }
  });
});

我在代码里记录了访问的路径以及列表是否存在的提示,但日志只显示了路径(此处为'home'),完全没输出存在或不存在的提示,日志内容如下:

[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
home

解决方法

1. 确保Redis客户端连接正常

先检查Redis客户端是否成功建立连接,添加连接监听日志确认:

client.on('connect', () => {
  console.log('Redis 连接成功');
});

client.on('error', (err) => {
  console.error('Redis 连接失败:', err);
});

2. 处理exists命令的错误回调

原代码没有处理exists的错误情况,如果Redis调用出错,回调只会静默失败,加上错误日志才能定位问题:

client.exists(customListName, (err, reply) => {
  // 先处理错误
  if (err) {
    console.error('检测键是否存在时出错:', err);
    return res.status(500).send('服务器内部错误');
  }

  if (reply === 0) {
    console.log("列表不存在,开始创建");

    const multi = client.multi();
    const customList = ["Have fun!", "Play Games!", "Watch Movies!"];
    customList.forEach((item) => {
      multi.rPush(customListName, item);
    });
    // 处理批量操作的回调
    multi.exec((execErr, results) => {
      if (execErr) {
        console.error('批量插入数据出错:', execErr);
        return res.status(500).send('创建列表失败');
      }
      console.log("列表创建成功");
      res.send(`列表 ${customListName} 已创建并插入数据`);
    });
  } else {
    console.log("列表已存在");
    res.send(`列表 ${customListName} 已存在`);
  }
});

3. 不要忽略响应对象res

原代码没有给请求返回任何响应,会导致客户端请求一直处于挂起状态,可能间接影响Redis命令的执行回调,务必在每个分支都调用res.send()或类似方法返回结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:55:16