AdonisJS后端API因CORS导致文件上传失败排查求助
碰到这种Docker环境下的跨域问题,我通常会从这几个方向一步步排查,毕竟本地裸跑和容器隔离环境的网络逻辑差异挺大的:
1. 先确认Docker容器间的网络连通性
你当前的前端请求是直接打向主机的3333端口,但容器内部的网络环境和主机是隔离的,很可能存在解析或连通问题:
- 进入Nginx容器,执行
curl http://lemcoe.nato:3333/uploader,看看能不能正常访问后端接口。如果连容器内部都访问不到,那问题大概率在网络层面 - 检查你的Docker Compose配置,两个容器是不是在同一个自定义网络里?默认的bridge网络有时候主机名解析不稳定,建议手动定义一个网络,然后让前端通过后端容器的名称(比如
adonis-api)来访问,比如请求http://adonis-api:3333/uploader,这样能绕过主机的DNS解析,直接在容器网络内部通信
2. 验证AdonisJS的CORS配置是否真的生效
有时候配置文件改了,但容器没重启,或者挂载路径不对导致配置没生效:
- 进入AdonisJS容器,直接查看
config/cors.js的内容,确认和你本地的配置一致 - 在主机上用curl模拟OPTIONS请求,检查响应头:
重点看响应里有没有curl -X OPTIONS http://lemcoe.nato:3333/uploader -H "Origin: http://lemcoe.nato:9090" -vAccess-Control-Allow-Origin: *(或者指定的Origin)、Access-Control-Allow-Methods包含POST,以及Access-Control-Allow-Headers包含Content-Type(因为文件上传是multipart/form-data,属于非简单请求) - 可以试着把CORS配置里的
headers从true改成明确的数组,比如headers: ['Content-Type', 'Accept', 'Authorization'],避免框架对“允许所有头”的解析出现偏差
3. 检查Nginx配置是否干扰了跨域
如果Nginx配置了自己的CORS头,可能和后端返回的头冲突,导致浏览器报错:
- 查看Nginx的配置文件,有没有添加
add_header Access-Control-*之类的规则,如果有,要么删掉,要么确保和后端的CORS规则一致 - 另外,生产环境更推荐的做法是用Nginx做反向代理,把前端的API请求转发到后端容器,这样前端和后端同域名同端口,彻底消除跨域。比如在Nginx配置里加:
然后前端把请求地址改成location /api/ { proxy_pass http://adonis-api:3333/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }/api/uploader,这样就不需要处理任何CORS问题了
4. 排查主机的防火墙/安全组
生产环境的主机可能有防火墙或安全组限制,导致前端无法访问3333端口:
- 在主机上执行
telnet localhost 3333,确认后端服务正常监听 - 从前端所在的机器执行
telnet lemcoe.nato 3333,看能不能建立连接。如果不行,检查主机的防火墙规则(比如ufw、iptables),或者云服务商的安全组,确保3333端口对前端IP开放
5. 查看AdonisJS的日志,确认请求是否到达后端
有时候OPTIONS请求成功,但POST请求因为后端的业务逻辑错误(比如文件上传目录不存在、权限不足)没返回响应,浏览器会误以为是CORS问题:
- 执行
docker logs <你的adonis容器名称>,查看日志里有没有OPTIONS和POST请求的记录- 如果POST请求根本没出现在日志里,说明请求没到达后端,回到网络连通性排查
- 如果有日志但报错,比如权限问题、路径不存在,就针对性解决后端的业务问题
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

