Как динамически реагировать с помощью файлов, содержащих шаблоны?

Мы разрабатываем веб-консоль и 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

Мы очень ценим вашу помощь в решении этой проблемы .

, 👍-1

Обсуждение

Багги в каком смысле?, @Sim Son

return F(request->host()); вызывает ошибку времени компиляции! Нужно исправить это и принадлежащие ему проблемы. Предполагается, что есть две проблемы: 1. запрос недоступен внутри лямбда-выражения и 2. **напрямую относится к преобразованию типа данных**, @Śhāhēēd

Ошибка компилятора не является ошибкой... пожалуйста, включите сообщение об ошибке, @Sim Son


1 ответ


Лучший ответ:

0

Исправлено:

auto processor = [request](const String &var) -> String {
    if (var == "REQ_HOST_ID"){
        return request->host().c_str();
    }
    return String();
};

Две ошибки вызывают ошибку времени компиляции:

  1. Необходимо передать request в выражение Lambda
  2. Не нужно оборачивать динамическое значение макросом F()
,