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

Node.js Express路由中Redis Client无法执行GET请求获取键值

问题原因

你使用的是Redis客户端v4.x版本,该版本已移除回调式API,所有命令默认返回Promise。原代码中client.get(key, callback)的写法不会触发回调函数,这就是in client.get()日志无输出、请求持续挂起的核心原因——Redis服务端确实收到了GET请求,但Node端因API不兼容无法处理响应。

修复方案

将回调写法改为async/await或Promise.then()形式,同时修复代码中numVisits++的逻辑错误(初始值为null时会导致异常)。

修改后的server.js代码:

'use strict';

const express = require('express');
const redis = require('redis');
const PORT = 80;
const HOST = '0.0.0.0';
const app = express();

const client = redis.createClient({
  url: 'redis://redis:6379'
});

// 监听Redis连接错误
client.on('error', (err) => console.log('Redis Client Error', err));

// 确保Redis连接成功后再启动Web服务
(async () => {
  await client.connect();
  console.log('->Redis Client Connected!');
  
  app.listen(PORT, HOST, () => {
    console.log(`Web app running on http://${HOST}:${PORT}`);
  });
})();

app.get('/', (req, res) => {
  res.send('Hello world');
});

app.get('/foo', async (req, res) => {
  console.log("in /foo");
  try {
    const numVisits = await client.get('numVisits');
    console.log("in client.get()");
    
    let numVisitsToDisplay = parseInt(numVisits, 10) + 1;
    if (isNaN(numVisitsToDisplay)) {
      numVisitsToDisplay = 1;
    }
    
    res.send(`<h1>Number of visits is: ${numVisitsToDisplay}`);
    // 存储更新后的访问次数,避免原代码中numVisits为null时的异常
    await client.set('numVisits', numVisitsToDisplay);
  } catch (err) {
    console.error('Redis操作出错:', err);
    res.status(500).send('服务器内部错误');
  }
});

关键改动说明

  1. API风格切换:用await client.get('numVisits')替代回调写法,同时将路由处理函数标记为async,适配Redis v4的Promise风格API。
  2. 连接逻辑优化:将Web服务启动逻辑放在Redis连接成功的回调中,避免服务启动时Redis尚未就绪。
  3. 逻辑错误修复:原代码中numVisits++在numVisits为null时会生成NaN,改用numVisitsToDisplay直接存储有效数值。
  4. 异常处理:添加try/catch捕获Redis操作中的异常,避免请求因未处理错误挂起。

额外注意事项

Docker Compose的depends_on仅保证容器启动顺序,不保证Redis服务完全就绪。若需确保Redis可用后再启动Node服务,可添加健康检查或使用wait-for-it等工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:20:00