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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:24:55