所以我试图在一个项目中使用 ESPAsyncWebServer,并且由于该项目的大小,我将我的代码重构为一堆不同的库。这是客户端服务器处理部分的一部分。
我已经确定如何有效地将 * 请求传递给单独的函数,以清理我的代码。 IE。 在我的库 .cpp 文件中
server->on("/heap", HTTP_GET, [this](AsyncWebServerRequest *request) { handleHeap(request); });
哪个火:
void CServer::handleHeap(AsyncWebServerRequest *request) { request->send(200, "text/plain", String(ESP.getFreeHeap())); }
我遇到的问题是尝试将我的“处理器”函数传递给模板响应。
String CServer::processor(const String &var)
{
if (var == "locationLat")
return String(gps.location.lat());
return String();
}
void CServer::handleGPS(AsyncWebServerRequest *request)
{
request->send(SPIFFS, "/gps.htm", String(), processor);
}
错误:没有匹配的函数可调用 'AsyncWebServerRequest::send(fs::FS&, const char [9], String, )
尝试在 Lambda 中传递 handler() 也无法编译,因为没有参数传入。
错误:没有匹配的调用函数 到'
'CServer::processor()
request->send(SPIFFS, "/gps.htm", String(), [this] { processor(); });
^ lib\CServer\CServer.cpp:128:66:注意:
候选者是:lib\CServer\CServer.cpp:108:8:注意:String
CServer::processor(const String&)
sooo,如何按照指南此处中的指示将所需的处理器函数传递到我的响应参数中?
供参考:
String processor(const String& var)
{
if(var == "HELLO_FROM_TEMPLATE")
return F("Hello world!");
return String();
}
// ...
//Send index.htm with template processor function
request->send(SPIFFS, "/index.htm", String(), false, processor);
如果全部都在 main.cpp 中就好了,但这不是我想要做的!
由于您的处理器函数是一个类方法,因此您需要将其与隐式
this
参数绑定。
我们可以找到回调typedef:
typedef std::function<String(const String&)> AwsTemplateProcessor;
request->send(SPIFFS, "/index.htm", String(), false, [this](const String &var) -> String { return this->processor(var); });
这里的 lambda 采用
const String &var
作为参数,例如 AwsTemplateProcessor
,我们通过在 lambda 原型后面写入 AwsTemplateProcessor
来精确确定 -> String
函数的返回类型。通过正确精确地确定参数 和 返回类型,发送方法可以将 lambda 与 std::function
(AwsTemplateProcessor
) 相关联。
制定你的方法
static
,或者调用应该是:
void CServer::handleGPS(AsyncWebServerRequest *request)
{
request->send(SPIFFS, "/gps.htm", String(), [this](const String& var) { return processor(var); });
}