ESP32温度数据Web实时绘图应用部署后无法获取数据报错求助
ESP32温度数据Web实时绘图应用部署后无法获取数据报错求助
看起来你这个实时温度绘图的项目在本地跑完全正常,一部署到线上就卡在fetch的TypeError报错,确实挺闹心的,我帮你梳理下几个大概率的问题点和对应的解决办法:
1. 跨域资源共享(CORS)限制
本地开发时浏览器对localhost的跨域请求会放宽限制,但部署到线上后,前端页面的域名和你3000端口的后端服务域名如果不属于同一域(包括端口不同也算跨域),浏览器就会触发CORS安全机制,直接阻止fetch请求。
解决办法:
给你的Express服务(3000端口那个)添加CORS中间件:
- 首先安装
cors依赖:npm install cors - 修改Express服务代码:
const express = require('express'); const cors = require('cors'); const serv = express(); // 允许所有跨域请求(生产环境建议配置为你的前端域名,比如{origin: 'https://your-website.com'}) serv.use(cors()); serv.get("/data", function(req, res){ res.status(200).send(String(curr_temperature)); }); serv.listen(3000);
2. 服务器端口未开放
大部分云服务器或虚拟主机默认只开放80、443这类常用端口,你的3000和8080端口可能没在服务器的防火墙/安全组里配置入站规则,导致前端无法访问3000端口,ESP32也没法把数据POST到8080端口。
解决办法:
- 登录你的服务器管理后台,找到安全组/防火墙设置,添加3000和8080端口的入站规则,允许公网访问;
- 更推荐的方式是合并两个服务到同一个端口,减少端口管理的麻烦,后面会给你合并代码的示例。
3. 多服务端口冗余,合并优化
你现在同时启动了两个独立的HTTP服务(3000的Express和8080的原生HTTP),其实完全可以把接收ESP32数据和给前端提供数据的接口整合到一个Express服务里,这样只需要维护一个端口,部署更简单。
合并后的代码示例:
const express = require('express'); const cors = require('cors'); const serv = express(); serv.use(cors()); serv.use(express.text()); // 解析POST请求的文本格式数据 let curr_temperature = 0; // 给前端提供实时温度数据的接口 serv.get("/data", function(req, res){ res.status(200).send(String(curr_temperature)); }); // 接收ESP32 POST过来的温度数据的接口 serv.post("/post_data", function(req, res){ curr_temperature = Number(req.body); console.log("Received temperature:", curr_temperature); // 加日志方便调试 res.end('ok'); // 必须给ESP32返回响应,否则设备可能会持续重试 }); // 统一使用一个端口,比如3000(生产环境可以改成80/443) serv.listen(3000, function(){ console.log("Server is listening on port 3000"); });
修改后,ESP32只需要把数据POST到http://your-website:3000/post_data,前端fetchhttp://your-website:3000/data即可,只需要开放3000一个端口。
4. HTTPS混合内容限制
如果你的前端网站部署在HTTPS环境下,浏览器会禁止页面发起HTTP请求(这是混合内容安全策略),如果你的后端服务还是用HTTP协议,就会导致fetch请求失败。
解决办法:
- 生产环境:给后端服务配置HTTPS(可以用Let's Encrypt免费证书),确保前后端都用HTTPS;
- 测试阶段:可以在浏览器开发者工具的设置里临时允许混合内容,但不推荐用于生产环境。
额外调试建议
- 打开浏览器开发者工具(F12),切换到Network标签,查看fetch请求的具体错误详情(比如是CORS错误、404还是500),能帮你精准定位问题;
- 先用Postman或curl测试后端接口是否正常,比如执行
curl http://your-website:3000/data,看是否能返回温度数据; - 在后端接口里添加日志,检查ESP32是否真的把数据发送到了服务器。
备注:内容来源于stack exchange,提问作者kisuke_urahara




