You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动