使用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
相关产品推荐
相关产品推荐

