Как динамически реагировать с помощью файлов, содержащих шаблоны?
Мы разрабатываем веб-консоль и REST API для NodeMCU V3 ESP8266, используя ESPAsyncWebServer
. Мы столкнулись с некоторыми трудностями при обслуживании динамических страниц с использованием файлов, содержащих шаблоны! Мы не можем заменить REQ_HOST_ID
на request- >host()
с помощью обработчика шаблонов! Следующий код работает нормально, если указано статическое имя хоста.
// server->on("/", HTTP_GET, HomePage::index);
void HomePage::index(AsyncWebServerRequest *request) {
Serial.println(request->host());
auto processor = [](const String &var) -> String {
if (var == "REQ_HOST_ID"){
// вернуть F(запрос->хост()); //ИСПРАВИТЬ МЕНЯ
return F("10.10.10.1");
}
return String();
};
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/www/index.html", String(), false, processor);
response->addHeader("Server", "Academia Web Server");
request->send(response);
}
Отредактировано:
Закомментированный код вызывает ошибку времени компиляции, и его необходимо исправить, чтобы установить значение request->host()
. request->host().c_str()
вызывает ту же ошибку!
/Users/Chorke/Documents/Arduino/libraries/AcademiaCoreWeb/src/pages/HomePage.cpp: In lambda function:
/Users/Chorke/Documents/Arduino/libraries/AcademiaCoreWeb/src/pages/HomePage.cpp:16:22: error: 'request' is not captured
return F(request->host()); //FIXME
^
/Users/Chorke/Library/Arduino15/packages/esp8266/hardware/esp8266/2.6.3/cores/esp8266/WString.h:38:76: note: in definition of macro 'FPSTR'
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
^
/Users/Chorke/Library/Arduino15/packages/esp8266/hardware/esp8266/2.6.3/cores/esp8266/WString.h:39:34: note: in expansion of macro 'PSTR'
#define F(string_literal) (FPSTR(PSTR(string_literal)))
^
/Users/Chorke/Documents/Arduino/libraries/AcademiaCoreWeb/src/pages/HomePage.cpp:16:20: note: in expansion of macro 'F'
return F(request->host()); //FIXME
Мы очень ценим вашу помощь в решении этой проблемы .
@Śhāhēēd, 👍-1
Обсуждение1 ответ
Лучший ответ:
▲ 0
Исправлено:
auto processor = [request](const String &var) -> String {
if (var == "REQ_HOST_ID"){
return request->host().c_str();
}
return String();
};
Две ошибки вызывают ошибку времени компиляции:
- Необходимо передать
request
в выражениеLambda
- Не нужно оборачивать динамическое значение макросом
F()
,
@Śhāhēēd
Смотрите также:
- Какие входные контакты я могу использовать на ESP8266 NodeMCU
- ESP8266 не может подключиться к брокеру MQTT
- Однонаправленная связь между NodeMCU и Arduino выплевывает мусор
- Wemos D1 не работает с MH-Z19B (датчик CO2)
- Ошибка программного сброса wdt на NodeMCU (ESP8266)
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- NODEMCU 1.0 HX711 Тензодатчик читает странный текст
- Как защитить ссылку/URL-адрес формы ESP-12E для управления светодиодом
Багги в каком смысле?, @Sim Son
return F(request->host());
вызывает ошибку времени компиляции! Нужно исправить это и принадлежащие ему проблемы. Предполагается, что есть две проблемы: 1.запрос
недоступен внутри лямбда-выражения и 2. **напрямую относится к преобразованию типа данных**, @ŚhāhēēdОшибка компилятора не является ошибкой... пожалуйста, включите сообщение об ошибке, @Sim Son