ошибка медитации гуру при чтении данных из параметров запроса ESPAsyncWebServer

Я работаю над ESP32, новичком в этом устройстве.

В настоящее время я столкнулся со следующей ошибкой. когда я пытаюсь прочитать данные из request-> value (). c_str (), серийный монитор показывает мне ошибку медитации гуру SS ошибки:  введите описание изображения здесь

Мой код:

server.on("/register", HTTP_POST, [](AsyncWebServerRequest *request) {
    request->send(200, "text/plain", Register(request->getParam("plain",true)).c_str());
});

Функция:

string Register(AsyncWebParameter *request){

  const size_t bufferSize = JSON_OBJECT_SIZE(1) + 250;;
  StaticJsonDocument<bufferSize>  data;
  deserializeJson(data, request->value().c_str()); // facing issue here when request->value().c_str() is called
  const char* name = data["username"];

  return String("Execution complete");
  }

Я вернул простую функцию javascript для вызова API:

function Register() {
const tosend={
      "username":"Mohit",
      "password":"Mohit10#",
      "lastname":"mhatre",
      "firstname":"Mohit"
  };
  const url="http://192.168.2.120/register";
  
  fetch(url, {
    method: 'post',
    headers: {
      // if you want to set
    },
    body: tosend
  })
    .then(
      function(response) {
        response.json().then(function(data) {
          console.log(data);
        });
      }
    )
    .catch(function(err) {
      console.log('Fetch Error :-S', err);
    });
}

Может ли кто-нибудь помочь мне решить проблему, которую я новичок в этом и застрял здесь со вчерашнего дня


person Mohit    schedule 30.04.2020    source источник
comment
Разве вы не должны проверить, deserializeJson успешно, и что полученный объект имеет поле name, прежде чем обращаться к нему?   -  person Botje    schedule 30.04.2020
comment
нет, десериализация не запускается, проверено уже как только запрос- ›value (). c_str () это ударил, возникает ошибка @Botje   -  person Mohit    schedule 30.04.2020
comment
request->getParam("plain",true) возвращает nullptr, если упомянутого параметра нет. Всегда проверяйте свои предположения request->hasParam("plain", true)) и возвращайте значения!   -  person Botje    schedule 30.04.2020
comment
да, спасибо, все сработало, параметр был пуст   -  person Mohit    schedule 13.05.2020


Ответы (1)


Я решил эту проблему. Как описано Ботье в комментарии выше. Проблема заключалась в том, что Register (request-> getParam ("plain", true)). C_str () возвращал пустые результаты, поэтому, когда я пытался получить к ним доступ, это вызвало проблему.

Ниже приведены внесенные мной изменения кода:

Код сервера:

  server.on("/register", HTTP_POST, [](AsyncWebServerRequest *request){request->send(200, "text/plain", "");}, NULL, Register);

функция

void Register(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)
{
  chipid=ESP.getEfuseMac();

  StaticJsonDocument<200> doc;
  deserializeJson(doc, data);

  doc["device_id"] = (uint16_t)(chipid>>32)+(uint32_t)chipid;

  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer);
  // used the json as required.     
}
person Mohit    schedule 29.05.2020