gpt4 book ai didi

node.js - 如何在node.js中实现用户定义的规则?

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:22 25 4
gpt4 key购买 nike

user defined rule sample

我需要实现一个像上面这样的用户定义的规则引擎(使用的技术:nodejs + mongodb)

我遇到了一个 SO Q,它在 MySQL 中存储数据,但我不知道如何查询数据并通过 javascript 对其进行评估:

What is an appropriate data structure and database schema to store logic rules?

任何有关设计和实现的想法都将受到高度赞赏。

阳光明媚

最佳答案

使用您显示的规则构建 SQL 查询将非常容易。与构造 mongo 查询的情况不同。

我制作了一个类似的引擎,将规则存储为 sql 规则,然后编写了一个模块来从 sql 查询构造 mongo 查询(一个简单的)。

为了将 mongo 规则与 javascript 对象进行匹配,我使用了 sift 库(没有与 mongo 查询引擎相同的正则表达式支持)- https://github.com/crcn/sift.js

因此,如果可能的话,我建议您将数据存储在sql数据库中,然后在完成适当的转义后应用您构建的sql规则(以避免sql注入(inject))

这是我在前端用来构造sql类型规则的函数 -

(rule 这里是映射到 UI 中每一行的表达式数组)

function getRuleString(rule) {
var andOrStack = [];
var lastExpressionDepth = 0;
var tempRuleString = '';
var countOpenBrackets = 0;

if(!rule || !rule.expressionRows) {
return '';
}

rule.expressionRows.forEach(function(expressionRow, index) {
expressionRow.depth = parseInt(expressionRow.depth, 10);
if(lastExpressionDepth !== expressionRow.depth) {

// if this is an outer expression than the previous
if((lastExpressionDepth - expressionRow.depth) > 0) {
for(var i=0; i<(lastExpressionDepth - expressionRow.depth); i++) {
tempRuleString += ' ) ';
}
tempRuleString += ' ' + andOrStack.pop() + ' ';
} else {
tempRuleString += ' ' + andOrStack.pop() + ' ( ';
}

lastExpressionDepth = expressionRow.depth;
} else {
if(index > 0) {
tempRuleString += ' ' + andOrStack.pop() + ' ';
}
}

tempRuleString += expressionRow.firstColumn + ' ' + expressionRow.operator + ' "' + expressionRow.expression + '"';
andOrStack.push(expressionRow.andOr);
});

tempRuleString += Array.apply(null, Array(tempRuleString.split('(').length-tempRuleString.split(')').length)) // jshint ignore: line
.map(String.prototype.valueOf, ' ) ').join('');

return tempRuleString;
}

关于node.js - 如何在node.js中实现用户定义的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21965542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com