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

Docker Traefik路由异常:Node.js后端部分路由无法访问求助

解决方案

1. 简化Traefik路由规则

你的Traefik规则过于冗余复杂,导致多数路径无法被正确匹配。只需要保留Host匹配规则即可,Traefik会自动将该域名下的所有请求转发到后端服务,具体路由逻辑交给Node.js处理:

labels:
  - traefik.enable=true
  - traefik.http.routers.backend.rule=Host(`backend.my-domain.de`)
  - traefik.http.routers.backend.tls=true
  - traefik.http.routers.backend.tls.certresolver=lets-encrypt
  - traefik.http.services.backend.loadbalancer.server.port=8080

多余的Path条件会过滤掉未明确指定的路由(比如/addPlayer、/deleteUser),这就是你测试中只有/login能访问的核心原因。

2. 修复Node.js中的路径错误

/registerNewPlayer返回500错误,本质是multer无法写入正确目录,同时静态文件服务路径配置错误:

  • Multer存储路径:生产环境容器内的img目录是/usr/src/app/img(对应你挂载的./img:/usr/src/app/img),必须修改multer的destination为绝对路径:
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        // 生产环境使用容器内绝对路径
        cb(null, '/usr/src/app/img')
    },
    filename: (req, file, cb) => {
        cb(null, Date.now() + path.extname(file.originalname))
    }
})
  • 静态文件服务路径:express.static的路径必须指向容器内的实际目录,而非根目录下的/img:
// 正确挂载静态文件目录
app.use("/img", express.static('/usr/src/app/img'));

之前的错误路径会导致Node.js去容器根目录查找/img,而非你挂载的目录,直接引发文件读写错误。

3. 验证容器权限

确保Node进程拥有写入/usr/src/app/img目录的权限,可通过两种方式处理:

  • 在Docker Compose中指定运行用户:
services:
  backend:
    # ...其他配置
    user: "node" # 使用node镜像默认用户运行,避免权限冲突
    volumes:
      - ./dist:/usr/src/app
      - ./img:/usr/src/app/img
  • 在宿主机调整目录权限:
chown -R 1000:1000 ./img

(1000是node镜像默认用户的UID/GID)

4. 测试验证

完成修改后重启容器:

docker-compose down && docker-compose up -d

此时测试所有路由:

  • POST backend.my-domain.de/registerNewPlayer
  • POST backend.my-domain.de/login
  • POST backend.my-domain.de/addPlayer
  • POST backend.my-domain.de/deleteUser
  • GET backend.my-domain.de/img/[文件名]

所有路由均应正常工作,Traefik负责转发该域名下的全部请求到后端8080端口,Node.js处理具体路由逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:28:30