Flutter on Windows无法向WSL 2中运行的Node.js服务器发送HTTP请求
问题原因及解决方案
核心原因:Flutter Web的浏览器CORS策略拦截
你在Chrome中通过Dart VM Service运行Flutter应用,本质是Flutter Web应用,受浏览器的跨域资源共享(CORS)策略限制。而Postman是桌面客户端、浏览器直接访问URL时的请求模式,都不会触发CORS校验,所以能正常访问WSL2中的Node.js服务器。
具体解决方案
1. 给Node.js服务器配置CORS中间件(推荐)
这是最规范的解决方式,直接在Express服务中允许跨域请求:
- 安装CORS依赖:
npm install cors - 在
server.js中引入并启用:const express = require('express'); const cors = require('cors'); const app = express(); // 开发环境可直接允许所有跨域请求 app.use(cors()); // 生产环境建议限制允许的源(比如Flutter Web的运行地址) // app.use(cors({ // origin: 'http://localhost:5000' // 替换为你的Flutter Web实际运行端口 // })); app.get('/mint', (req, res) => { res.json({ message: "Service-mint is operational!" }); }); app.listen(3001, '0.0.0.0', () => { console.log('Server running on port 3001'); });
重启Node.js服务器后,再用Flutter发起请求即可。
2. 使用Windows主机的局域网IP访问
WSL2的内部IP(172.18.129.5)是虚拟网络的地址,Flutter Web在Chrome中可能无法直接访问。换成Windows主机的局域网IP:
- 在PowerShell中执行
ipconfig,找到当前网络适配器的IPv4地址(比如192.168.1.100) - 修改Flutter请求地址:
final response = await http.get(Uri.parse('http://192.168.1.100:3001/mint'));
3. 临时禁用Chrome的Web安全(仅开发环境)
如果只是临时验证问题,可以启动Chrome时关闭CORS校验:
- 关闭所有Chrome窗口
- 在命令提示符执行:
chrome.exe --disable-web-security --user-data-dir="C:/TempChromeDev" - 在这个Chrome窗口中运行Flutter应用,即可正常发起请求(注意:此方法仅用于开发调试,生产环境绝对禁止)
补充说明
你之前尝试的防火墙、端口代理、监听0.0.0.0等操作,都是针对Windows和WSL2之间的网络连通性,但核心问题出在浏览器的CORS策略,所以这些操作无法解决Flutter Web的请求拦截问题。
内容的提问来源于stack exchange,提问作者Lance-Legrand NGANDO-DAVID
相关产品推荐
相关产品推荐

