如何在JavaScript JSON规则引擎中定位触发规则失败的fact
定位规则引擎不匹配fact的实现方法
你大概率使用的是常见的json-rules-engine类JS规则引擎库,这类库本身已经内置了匹配结果的详情输出能力,不需要自己额外重构核心逻辑就能快速定位问题,具体方案如下:
方案1:使用引擎自带的结果详情字段
调用engine.run(fact)执行规则后,返回的结果中会自带results字段,里面会逐条件返回匹配状态,你可以直接过滤出匹配失败的项即可定位问题。
可直接运行的示例代码如下:
const { Engine } = require('json-rules-engine') const engine = new Engine() // 你原有规则添加逻辑 engine.addRule({ conditions: { all: [{ fact: 'score', operator: 'greaterThanInclusive', value: 200 }, { fact: 'players', operator: 'equal', value: 10 }] }, event: { type: 'success', } }) let fact = { score: 150, players: 10 } // 执行规则后解析结果 engine.run(fact).then(result => { // 筛选所有匹配失败的条件 const failedConditions = result.results.filter(condition => !condition.result) failedConditions.forEach(item => { console.log(`不匹配的fact字段:${item.condition.fact},规则要求:${item.condition.operator} ${item.condition.value},实际传入值:${fact[item.condition.fact]}`) }) })
运行后会直接输出:不匹配的fact字段:score,规则要求:greaterThanInclusive 200,实际传入值:150
方案2:自行封装校验逻辑(适配自研规则引擎场景)
如果你是自己手写实现的规则引擎核心,没有内置结果输出能力,可以按以下逻辑改造:
- 遍历
all/any条件组内的每一条规则,分别校验对应fact字段是否符合运算符要求 - 每完成一条规则的校验,就将
fact名称、预期规则、实际值、匹配结果存入状态数组 - 所有规则执行完成后,过滤出匹配结果为false的项,就是导致规则失败的fact
排查注意点
- 优先校验fact字段名和规则里的
fact配置是否完全一致,避免拼写错误导致的无意义不匹配 - 如果规则有多层嵌套的
all/any逻辑,遍历的时候要做递归处理,不要只校验第一层条件
内容的提问来源于stack exchange,提问作者prajay
相关产品推荐
相关产品推荐

