You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266(NodeMCU)传感器数据网页控制台出现innerHTML空对象错误求助

问题解决方案

一、修复"Uncaught TypeError: Cannot set properties of null (setting 'innerHTML')"错误

这个错误的核心原因是JavaScript代码尝试修改不存在的DOM元素,或者DOM未加载完成就执行了代码。按以下步骤排查修复:

1. 核对DOM元素ID与JS代码的一致性

检查Arduino生成的HTML页面中,是否存在JS代码里通过getElementById获取的所有元素。比如如果JS里写了document.getElementById("temp").innerHTML = ...,HTML里必须有对应的<span id="temp"></span>或<div id="temp"></div>,且ID拼写完全一致(区分大小写)。

2. 确保JS代码在DOM加载完成后执行

把更新页面的JS代码放到HTML的<body>标签末尾,或者用DOMContentLoaded事件包裹,避免DOM未就绪就执行代码:

document.addEventListener('DOMContentLoaded', function() {
  // 这里放原来的更新innerHTML的代码,比如:
  function updateData() {
    fetch("/api/data")
      .then(response => response.json())
      .then(data => {
        document.getElementById("temp").innerHTML = data.temperature + "°C";
        document.getElementById("hum").innerHTML = data.humidity + "%";
        document.getElementById("mq4").innerHTML = data.mq4;
      });
  }
  setInterval(updateData, 2000);
});

3. 检查Arduino代码的HTML模板输出

确认Arduino中生成HTML的字符串没有遗漏或写错元素ID,比如拼接HTML时是否正确输出了所有需要的ID标签。

二、实现传感器数据API接口

让ESP8266提供JSON格式的API,供其他服务器调用,步骤如下:

1. 封装传感器读取逻辑(可选但推荐)

把读取DHT11和MQ4的代码封装成可复用的函数,避免重复代码:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>

#define DHTPIN D4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
ESP8266WebServer server(80);

// 定义传感器数据结构体
struct SensorData {
  float temperature;
  float humidity;
  int mq4;
};

// 读取传感器数据的函数
SensorData readAllSensors() {
  SensorData data;
  // 读取DHT11数据
  data.humidity = dht.readHumidity();
  data.temperature = dht.readTemperature();
  // 读取MQ4数据(假设接在A0引脚)
  data.mq4 = analogRead(A0);

  // 处理传感器读取失败的情况
  if (isnan(data.humidity)) data.humidity = -1.0;
  if (isnan(data.temperature)) data.temperature = -1.0;
  return data;
}

2. 添加API路由

在Arduino的服务器初始化代码中,添加/api/data路由,返回JSON格式的数据:

void setup() {
  dht.begin();
  WiFi.begin("SSID", "PASSWORD");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  // 网页路由(原有的网页展示逻辑)
  server.on("/", []() {
    SensorData data = readAllSensors();
    String html = "<!DOCTYPE html><html><body>";
    html += "<h1>传感器数据</h1>";
    html += "<p>温度: <span id='temp'>" + String(data.temperature) + "</span>°C</p>";
    html += "<p>湿度: <span id='hum'>" + String(data.humidity) + "</span>%</p>";
    html += "<p>MQ4气体值: <span id='mq4'>" + String(data.mq4) + "</span></p>";
    html += "<script>"
            "document.addEventListener('DOMContentLoaded', function() {"
            "  function updateData() {"
            "    fetch('/api/data')"
            "      .then(res => res.json())"
            "      .then(data => {"
            "        document.getElementById('temp').innerHTML = data.temperature;"
            "        document.getElementById('hum').innerHTML = data.humidity;"
            "        document.getElementById('mq4').innerHTML = data.mq4;"
            "      });"
            "  }"
            "  setInterval(updateData, 2000);"
            "});"
            "</script>";
    html += "</body></html>";
    server.send(200, "text/html", html);
  });

  // API路由
  server.on("/api/data", HTTP_GET, []() {
    SensorData data = readAllSensors();
    String json = "{";
    json += "\"temperature\":" + String(data.temperature) + ",";
    json += "\"humidity\":" + String(data.humidity) + ",";
    json += "\"mq4\":" + String(data.mq4);
    json += "}";
    server.send(200, "application/json", json);
  });

  server.begin();
}

void loop() {
  server.handleClient();
}

3. 测试API接口

其他服务器或客户端可以通过访问http://ESP8266_IP/api/data获取JSON数据,格式如下:

{"temperature":25.0,"humidity":60.0,"mq4":350}

内容的提问来源于stack exchange,提问作者TOUSHIF HOSSAIN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:12:48