cloudevents + jmespath 简单规则执行

实际上属于一个简单的业务场景,数据实体基于了cloudevents,但是希望进行里边数据的check,对于不用的check 结果会有一些action(比如发送通知等),以下是一个简单实现示例

参考代码

  • demo.js
import jmespath from "jmespath";
import { CloudEvent } from "cloudevents";

const event = new CloudEvent({
  type: "com.example.sampletype",
  source: "/mycontext",
  data: { data1: 11, data2: 22, data3: 33 },
});

function logRule1(value) {
  console.log(`Rule 1 triggered: data1 is ${JSON.stringify(value)}`);
}

function logRule2(value) {
  console.log(`Rule 2 triggered: data2 is ${value}`);
}

function logRule3(value) {
  console.log(`Rule 3 triggered: data3 is ${value}`);
}

const actionFunctions = {
  logRule1,
  logRule2,
  logRule3,
};
 
const rules = [
  {
    name: "Rule 1: data1 is greater than 10",
    query: "{data1: data.data1, data2: data.data2, data3: data.data3}",
    condition: "data.data1 > 10 && (data.data2 === 22)",
    action: "logRule1", 
    isComplex: true,
  },
  {
    name: "Rule 2: data3 is equal to 33",
    query: "data.data3",
    condition: "=== 33",  
    action: "logRule3",
  }
];
rules.forEach((rule) => {
  const result = jmespath.search(event, rule.query);
  const conditionFunction = rule.isComplex ? new Function("data", `return ${rule.condition}`) : new Function("value", `return value ${rule.condition}`);
  if (result !== null && conditionFunction(result)) {
    const actionFunc = actionFunctions?.[rule.action];
    if (typeof actionFunc === "function") {
      actionFunc(result);
    } else {
      const actionFunction = new Function(
        "value",
        "return `" + rule.action + "`"
      );
      console.log(actionFunction(result));
    }
  }
});
  • 代码简单说明 对于配置我们使用了直接的json 格式,不附带函数,函数是动态创建或者通过查找的,比如condtion的执行,里边包含了简单表达式以及复杂表达式,使用了一个独立的字段标识了,对于复杂格式,condition 必须使用data. 格式,对于数据的拼接我们直接使用了jmespath 可以方便的进行数据,当然直接将cloudevents 的data 传递也是可以的, 比如query 使用data

说明

以上是一个简单的玩法,核心是利用了jmespath 处理,以及动态函数创建,如果希望实现复杂的规则处理,可以使用一些其他引擎工具

参考资料

https://www.npmjs.com/package/jmespath

https://www.npmjs.com/package/cloudevents

posted on 2025-12-04 08:02  荣锋亮  阅读(0)  评论(0)    收藏  举报

导航