在 Node-Red 中处理 HTTP 请求中的 MQTT 通信
Handling MQTT communication inside HTTP request in Node-Red
在 Node-Red 中,我希望能够在 HTTP 输入节点和响应节点之间使用 MQTT 发送消息并等待其响应。我觉得一张图更能说明问题:
问题是 HTTP 响应节点必须以某种方式直接链接到输入节点,所以我想在收到 HTTP 输入后将整个消息保存在上下文中,然后在发送响应之前恢复它。问题是显然,消息的结构是循环的,因此我不能直接将它转换为字符串,以将其存储在上下文中。
我尝试了不同的方法来解决这个问题(我看过这个:JSON.stringify, avoid TypeError: Converting circular structure to JSON 并且我尝试使用 circular-json 模块,但都不起作用)。
这在某种程度上打破了 MQTT 的异步特性,而 Pub/Sub 可以使用它并不是它的强项。
您必须考虑如果没有响应消息会发生什么,因为无法知道其他 MQTT 客户端是否已连接。
HTTP 请求来自哪里?如果它来自网页,那么您可以使用 MQTT over Websockets 直接发出请求或使用普通 Websockets ,从而完全不需要 HTTP 调用。
话虽如此,您应该能够将 msg
对象存储在上下文中,但无需将其转换为字符串,因为默认的上下文存储引擎只是一个内存对象存储。所以只需将对象添加到上下文并在响应到来时检索它。
您可以对触发节点做一些事情来处理超时问题。
在 Node-Red 中,我希望能够在 HTTP 输入节点和响应节点之间使用 MQTT 发送消息并等待其响应。我觉得一张图更能说明问题:
问题是 HTTP 响应节点必须以某种方式直接链接到输入节点,所以我想在收到 HTTP 输入后将整个消息保存在上下文中,然后在发送响应之前恢复它。问题是显然,消息的结构是循环的,因此我不能直接将它转换为字符串,以将其存储在上下文中。
我尝试了不同的方法来解决这个问题(我看过这个:JSON.stringify, avoid TypeError: Converting circular structure to JSON 并且我尝试使用 circular-json 模块,但都不起作用)。
这在某种程度上打破了 MQTT 的异步特性,而 Pub/Sub 可以使用它并不是它的强项。
您必须考虑如果没有响应消息会发生什么,因为无法知道其他 MQTT 客户端是否已连接。
HTTP 请求来自哪里?如果它来自网页,那么您可以使用 MQTT over Websockets 直接发出请求或使用普通 Websockets ,从而完全不需要 HTTP 调用。
话虽如此,您应该能够将 msg
对象存储在上下文中,但无需将其转换为字符串,因为默认的上下文存储引擎只是一个内存对象存储。所以只需将对象添加到上下文并在响应到来时检索它。
您可以对触发节点做一些事情来处理超时问题。