Node-RED 1.2.9:WebSocket实例获取及请求响应式节点实现问询
Node-RED 1.2.9 WebSocket 问题解决方案
问题1:获取内置websocket in节点的WebSocket实例
内置websocket in节点没有对外暴露WebSocket实例的接口,Node-RED核心节点会封装底层实例以保证稳定性。硬要获取的话只能修改节点源码,但这会破坏封装性,且版本更新后可能失效,完全不推荐。另外,你的第二个需求不需要直接操作实例,有更合理的实现方式。
问题2:实现类似http request的请求响应式WebSocket节点
针对请求响应模式的WebSocket通信,推荐两种实现方式:
方案1:现有节点组合实现
用websocket out、websocket in配合function节点做请求响应关联:
- 发送请求前,给消息添加唯一
msg.correlationId(比如Date.now() + '-' + Math.random().toString(36).slice(2,9)) - 通过
websocket out发送请求到服务端,要求服务端响应时带回该correlationId websocket in收到响应后,用function节点根据correlationId匹配对应请求,再转发给下游
示例function节点代码(分发送和处理响应两段):
// 发送请求时的预处理逻辑 if (!global.get('wsPendingRequests')) { global.set('wsPendingRequests', {}); } const pending = global.get('wsPendingRequests'); if (msg._action === 'sendRequest') { msg.correlationId = Date.now() + '-' + Math.random().toString(36).slice(2,9); pending[msg.correlationId] = msg; global.set('wsPendingRequests', pending); return msg; } // 响应处理逻辑 if (msg.payload?.correlationId && pending[msg.payload.correlationId]) { const originalMsg = pending[msg.payload.correlationId]; delete pending[msg.payload.correlationId]; global.set('wsPendingRequests', pending); return { ...originalMsg, payload: msg.payload.data }; }
方案2:自定义节点开发
如果组合节点不够灵活,可以开发自定义节点:
- 参考Node-RED官方自定义节点开发规范
- 在节点内部维护WebSocket连接,自动生成
correlationId并映射请求与响应 - 封装发送请求、等待响应、转发结果的完整逻辑,对外提供类似
http request节点的交互方式
背景说明
采用WebSocket而非HTTP/REST的原因:产品安全要求通信遵循"don't call us we'll call you"模式,禁止Node-RED主动发起HTTP请求,因此选择WebSocket实现单向发起的通信。

内容的提问来源于stack exchange,提问作者akagixxer
相关产品推荐
相关产品推荐

