Node.js中Redis通过请求参数获取数据失败问题排查
问题:Node.js中Redis通过Query参数获取数据失败,但硬编码ID成功
问题描述
我在Node.js中编写了Redis的get功能代码和路由:使用硬编码的game_id时能成功从Redis获取对应游戏数据,但通过HTTP请求的query参数传递game_id时,却提示找不到对应key的数据,不清楚问题所在。
相关代码
Redis操作代码
const redis = require("redis"); const client = redis.createClient({ url: "redis://localhost:6379", }); // 处理Redis客户端错误 client.on("error", (err) => { console.error("Redis error:", err); }); // 连接Redis (async () => { try { await client.connect(); console.log("Connected to Redis"); } catch (err) { console.error("Failed to connect to Redis:", err); } })(); const testRedis = async (game_id) => { try { console.log(`Getting value for key: game:${game_id}`); const value = await client.get(`game:${game_id}`); if (value === null) { console.log(`No value found for key game:${game_id}`); } else { console.log("Value:", value); } } catch (err) { console.error("Redis test error:", err); } finally { console.log("Quitting Redis client..."); await client.quit(); console.log("Redis client closed."); } }; module.exports = { testRedis, };
路由代码
router.get("/game", async (req, res) => { const { game_id } = req.query; console.log(`Fetching game data for game_id: ${game_id}`); try { const gameData = await testRedis(game_id); if (gameData) { res.status(200).json(JSON.parse(gameData)); } else { res.status(404).json({ error: "Game not found" }); } } catch (err) { console.error("Error fetching game from Redis:", err); res.status(500).json({ error: "Internal server error" }); } });
运行输出
硬编码game_id运行输出
Getting value for key: game:U2WQ20 Value: {"game_id":"U2WQ20","users":[{"username":"nikhil","cards":["0_5","3_3","1_3","1_8","3_13"] },{"username":"john","cards":["3_4","1_10","0_9","1_11","0_13"]},{"username":"jane","cards":["3_9 ","3_2","1_12","3_12","1_9"]}],"play_deck":["2_5","2_7","3_11","2_8","2_4","0_12","1_2","1_6","2_ 12","1_1","3_5","3_7","2_9","0_1","0_6","1_5","0_3","0_10","1_13","2_3","2_11","2_13","3_1","0_7" ,"0_2","1_7","2_2","3_10","0_11","1_4","0_4","2_1","2_10","3_8","2_6","3_6"],"firstCard":"0_8"} Quitting Redis client... Connected to Redis Redis client closed.
通过Query参数传递game_id运行输出
Server started on port 8080 Connected to Redis Fetching game data for game id: U2WQ20 Getting value for key: game:U2WQ20 No value found for key game:U2WQ20 Quitting Redis client... Redis client closed.
问题分析与修复方案
核心问题
testRedis未返回数据:函数内仅打印获取到的值,没有return语句,导致路由中gameData始终为undefined,直接触发404响应。- 每次请求关闭Redis客户端:
finally块中调用client.quit(),第一次请求后客户端就被销毁,后续请求使用已失效的客户端连接Redis,无法正常读取数据。
修复后的Redis操作代码
const redis = require("redis"); const client = redis.createClient({ url: "redis://localhost:6379", }); // 处理Redis客户端错误 client.on("error", (err) => { console.error("Redis error:", err); }); // 仅初始化连接一次 (async () => { try { await client.connect(); console.log("Connected to Redis"); } catch (err) { console.error("Failed to connect to Redis:", err); } })(); const testRedis = async (game_id) => { try { console.log(`Getting value for key: game:${game_id}`); const value = await client.get(`game:${game_id}`); if (value === null) { console.log(`No value found for key game:${game_id}`); return null; } else { console.log("Value:", value); return value; } } catch (err) { console.error("Redis test error:", err); throw err; } // 移除客户端关闭逻辑,复用单例客户端 }; module.exports = { testRedis, };
说明
- Redis客户端采用单例复用模式,初始化时连接一次即可,应用退出时再关闭,避免重复创建/销毁连接。
testRedis明确返回获取到的数据或null,确保路由能正确判断并返回对应响应。
内容的提问来源于stack exchange,提问作者Nikhil Chopra
相关产品推荐
相关产品推荐

