Docker Compose端口映射失效:Node.js+Redis应用无法访问求助
问题排查与解决
核心问题1:Express监听地址限制
你的Express应用默认只监听容器内部的localhost(127.0.0.1),而Docker端口映射是将主机的4001端口转发到容器的8081端口,但容器的localhost仅对容器自身可见,外部主机无法访问。
修复方案:修改index.js中的监听代码,让应用监听容器的所有网络接口(0.0.0.0):
app.listen(8081, '0.0.0.0', () => { console.log('listening on port 8081'); });
核心问题2:旧版Redis客户端的连接阻塞
你使用的redis@2.8.0是非常老旧的版本,该版本的客户端在Redis服务未就绪或连接失败时,会静默挂起client.get/client.set等请求,导致浏览器请求超时并重置连接。
修复方案:给Redis客户端添加连接状态监听,确保连接成功后再处理请求,同时捕获错误避免阻塞:
const express = require('express'); const redis = require('redis'); const app = express(); const client = redis.createClient({ host: 'redis-server', port: 6379, }); // 监听Redis连接错误 client.on('error', (err) => { console.error('Redis连接错误:', err); }); // 连接成功后初始化访问次数 client.on('connect', () => { client.set('visits', 0, (err) => { if (err) console.error('初始化访问次数失败:', err); }); }); app.get('/', (req, res) => { client.get('visits', (err, visits) => { if (err) { console.error('获取访问次数失败:', err); return res.status(500).send('获取数据失败'); } res.send('Number of visits ' + visits); client.set('visits', parseInt(visits) + 1, (err) => { if (err) console.error('更新访问次数失败:', err); }); }); }); app.listen(8081, '0.0.0.0', () => { console.log('listening on port 8081'); });
额外建议
考虑升级Redis客户端到最新稳定版(如4.x),新版采用Promise API,连接逻辑更健壮,错误处理更直观,能避免旧版本的诸多坑。
内容的提问来源于stack exchange,提问作者wick3d
相关产品推荐
相关产品推荐

