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('服务器内部错误'); } });
关键改动说明
- API风格切换:用
await client.get('numVisits')替代回调写法,同时将路由处理函数标记为async,适配Redis v4的Promise风格API。 - 连接逻辑优化:将Web服务启动逻辑放在Redis连接成功的回调中,避免服务启动时Redis尚未就绪。
- 逻辑错误修复:原代码中
numVisits++在numVisits为null时会生成NaN,改用numVisitsToDisplay直接存储有效数值。 - 异常处理:添加
try/catch捕获Redis操作中的异常,避免请求因未处理错误挂起。
额外注意事项
Docker Compose的depends_on仅保证容器启动顺序,不保证Redis服务完全就绪。若需确保Redis可用后再启动Node服务,可添加健康检查或使用wait-for-it等工具。
内容的提问来源于stack exchange,提问作者swiss_knight
相关产品推荐
相关产品推荐

