消息钩子

消息钩子允许在节点之间的消息传递路径中添加自定义代码。

以下图表显示了消息传递路径中可用的钩子集。

钩子

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。此时,本地路由器已经识别出要发送的节点,并设置了 SendEventdestination.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>" }