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

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.

问题分析与修复方案

核心问题

  1. testRedis未返回数据:函数内仅打印获取到的值,没有return语句,导致路由中gameData始终为undefined,直接触发404响应。
  2. 每次请求关闭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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:46:18