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/registerNewPlayerPOST backend.my-domain.de/loginPOST backend.my-domain.de/addPlayerPOST backend.my-domain.de/deleteUserGET backend.my-domain.de/img/[文件名]
所有路由均应正常工作,Traefik负责转发该域名下的全部请求到后端8080端口,Node.js处理具体路由逻辑。
内容的提问来源于stack exchange,提问作者user17293718
相关产品推荐
相关产品推荐

