消息钩子允许在节点之间的消息传递路径中添加自定义代码。
以下图表显示了消息传递路径中可用的钩子集。
send
并发送了一个或多个消息。onSend
一个节点调用了 node.send()
并发送了一个或多个消息。
该钩子传递了一个包含 SendEvent
对象的数组。这些对象中的消息正是节点传递给 node.send
的内容 - 这意味着可能会有对同一消息对象的重复引用。
此钩子应该同步完成,以避免意外行为。
如果它需要进行异步工作,必须 克隆并替换它接收到的事件中的消息对象。它必须 还要将 cloneMessage
属性设置为 false
,以确保之后不会在该消息上发生克隆。
如果钩子返回 false
,消息将不再继续处理。
// 示例同步 onSend 钩子
RED.hooks.add("onSend", (sendEvents) => {
console.log(`发送 ${sendEvents.length} 条消息`);
});
preRoute
一条消息即将被路由到其目的地。
该钩子传递一个单一的 SendEvent
。
此钩子应该同步完成,以避免意外行为。
如果它需要进行异步工作,必须 克隆并替换它接收到的事件中的消息对象。它必须 还要将 cloneMessage
属性设置为 false
,以确保之后不会在该消息上发生克隆。
如果钩子返回 false
,消息将不再继续处理。
// 示例异步 preRoute 钩子
RED.hooks.add("preRoute", (sendEvent, done) => {
// 由于此钩子需要进行异步工作,如果需要,则克隆消息
if (sendEvent.cloneMessage) {
sendEvent.msg = RED.util.cloneMessage(sendEvent.msg);
sendEvent.cloneMessage = false;
}
someAsyncAPI(sendEvent).then(() => {
done()
}).catch(err => {
// 错误意味着停止处理此消息
done(err);
})
});
preDeliver
一条消息即将被送达。
该钩子传递一个单一的 SendEvent
。此时,本地路由器已经识别出要发送的节点,并设置了 SendEvent
的 destination.node
属性。
如果需要,消息将已被克隆。
如果钩子返回 false
,消息将不再继续处理。
// 示例 preDeliver 钩子
RED.hooks.add("preDeliver", (sendEvent) => {
console.log(`即将送达 ${sendEvent.destination.id}`);
});
postDeliver
一条消息已被发送到其目的地。
该钩子传递一个单一的 SendEvent
。消息是异步传递给钩子执行的。
// 示例 postDeliver 钩子
RED.hooks.add("postDeliver", (sendEvent) => {
console.log(`消息已发送到 ${sendEvent.destination.id}`);
});
onReceive
一条消息即将被某个节点接收。
该钩子传递一个 ReceiveEvent
。
如果钩子返回 false
,消息将不再继续处理。
// 示例 onReceive 钩子
RED.hooks.add("onReceive", (receiveEvent) => {
console.log(`消息即将传递给节点: ${receiveEvent.destination.id}`);
});
postReceive
一条消息已被某个节点接收。
当消息交给节点的 input
处理程序时,该钩子传递 ReceiveEvent
。
// 示例 postReceive 钩子
RED.hooks.add("postReceive", (receiveEvent) => {
console.log(`接收到消息: ${receiveEvent.msg.payload}`);
});
onComplete
一个节点已完成处理一条消息或记录了相关错误。
该钩子传递一个 CompleteEvent
。
// 示例 onComplete 钩子
RED.hooks.add("onComplete", (completeEvent) => {
if (completeEvent.error) {
console.log(`消息处理完成但发生错误: ${completeEvent.error}`);
}
});
SendEvent
对象{
"msg": "<消息对象>",
"source": {
"id": "<节点-id>",
"node": "<节点-对象>",
"port": "<正在发送的端口索引>"
},
"destination": {
"id": "<节点-id>",
"node": undefined
},
"cloneMessage": "true|false"
}
ReceiveEvent
对象{
"msg": "<消息对象>",
"destination": {
"id": "<节点-id>",
"node": "<节点-对象>"
}
}
CompleteEvent
对象```json { “msg”: “<消息对象>", "node": { "id": "<节点-id>", "node": "<节点-对象>" }, "error": "<传递给 done 的错误,否则为 undefined>" }节点-对象>节点-id>消息对象>
版权所有 OpenJS Foundation 和 Node-RED 贡献者。保留所有权利。OpenJS Foundation 拥有并使用注册商标。有关 OpenJS Foundation 的商标列表,请参阅我们的 商标政策 和 商标列表。未在 OpenJS Foundation 商标列表 中列出的商标和徽标是其各自持有者的商标™或注册商标®。使用它们并不意味着与它们有任何关联或认可。
OpenJS Foundation | 使用条款 | 隐私政策 | OpenJS Foundation 章程 | 商标政策 | 商标列表 | Cookie 政策