plv8 中使用 eval 函数执行表达式计算
在js 开发中我们都说eval 函数是邪恶的,但是此函数也有好多妙用,以下是几个简单的案例
eval 执行基于js 的表达式计算
比如我们有以下表
CREATE TABLE rules (
id SERIAL PRIMARY KEY,
rule_expression text
);
-- Indices -------------------------------------------------------
CREATE UNIQUE INDEX rules_pkey ON rules(id int4_ops);
- 表内容
INSERT INTO "public"."rules"("id","rule_expression")
VALUES
(1,E'"${vars_name}".length>10');
- plv8 函数
CREATE or replace FUNCTION rule_test(id int,args text) RETURNS json AS
$$
// 解决es 模版函数问题,string 转string template
String.prototype.interpolate = function(params) {
const names = Object.keys(params);
const vals = Object.values(params);
return new Function(...names, `return \`${this}\`;`)(...vals);
}
var result = {}
var plan = plv8.prepare('SELECT rule_expression from rules where id = $1',['int']);
// only for test fetch one row
var rule_row = plan.execute([ id ])[0];
let vars_name = args;
var rule_template = rule_row.rule_expression.interpolate({vars_name});
var execresult = eval(rule_template);
result = {
id: id,
validate: execresult
}
plan.free();
return JSON.stringify(result);
$$
LANGUAGE plv8;
- 调用函数
select * from rule_test(1,'ddssaa'); // return {"id":1,"validate":false}
select * from rule_test(1,'dddaaasssssssssaa'); // return {"id":1,"validate":true}
一个比较通用的基于eval 的规则校验
- 约定
通过vars. 进行key 的处理支持标准的js && || - 参考例子
"${vars.name}".length>10&& "${vars.version}"=="1.0"
- 函数定义
CREATE or replace FUNCTION rule_test3(id int,args json,rule_row text) RETURNS json AS
$$
String.prototype.interpolate = function(params) {
const names = Object.keys(params);
const vals = Object.values(params);
return new Function(...names, `return \`${this}\`;`)(...vals);
}
var result = {}
let vars = {...args};
var rule_template = rule_row.interpolate({vars});
var execresult = eval(rule_template);
result = {
id: id,
validate: execresult
}
return JSON.stringify(result);
$$
LANGUAGE plv8;
- 调用
select a.*, rule_test3(3,'{"version":"1.0","name":"dddddddd"}',b.rule_expression) from apps a join rules b on a.id=b.id where a.id=2; /
// 2 rong {"id":3,"validate":false}
select a.*, rule_test3(3,'{"version":"1.0","name":"dddddd1111dd"}',b.rule_expression) from apps a join rules b on a.id=b.id where a.id=2;
// 2 rong {"id":3,"validate":true}
说明
以上是一个简单的使用plv8 使用js 实现的一个简单的规则判断,核心是对于string template 的函数处理
参考资料
https://plv8.github.io/#inline-statement-calls
https://github.com/plv8/plv8
plv8 中使用 eval 函数执行表达式计算的更多相关文章
- Ajax中的eval函数的用法
eval的定义和使用: Eval它是用来计算某个字符串,并且执行其中的JavaScript代码. 语法: 1) eval函数接受一个string这个参数,并且这个参数是必须的,这个参数就是要计算的这个 ...
- matlab中的eval函数使用
matlab中的eval函数使用 在matlab的命令行窗口中输入help eval命令回车就可以看到eval函数的官方解释,大概的意思就是执行matlab中的表达式,计算expression表示的代 ...
- JavaScript中的eval()函数
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作. eval(“1+2” ...
- javascript中的eval函数
eval()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数.否则会将字符串当成js代码进行编译,如果编译失败则抛出语法错误(SyntaxError)异常.如果编译成功则开始执行这段代码,并 ...
- python中的eval函数
eval() 函数十分强大 -- 将字符串 当成 有效的表达式 来求值 并 返回计算结果 In [1]: eval("1 + 3") Out[1]: 4 In [2]: eval( ...
- JavaScript中的eval()函数详解
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作 eval(“1 ...
- 纸壳CMS3.0中的规则引擎,表达式计算
纸壳CMS3.0中的规则引擎,用于计算通用表达试结果.通常业务逻辑总是复杂多变的,使用这个规则引擎可以灵活的修改计算表达式. IRuleManager IRuleManager,是使用规则引擎的主要接 ...
- js中的eval函数另一种实现
js中有一个函数eval可以一段文本改为js代码,本来使用eval也可以达到目的,但自己看了不少资料都不推荐使用eval函数,于是自己就在思考有没有不使用eval的方法? 其实需求很简单,就是把一个 ...
- Qt中使用匿名函数lambda表达式
一.为什么要使用匿名函数lamdba 首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元.如代码: #include <QCoreApplica ...
随机推荐
- 网络基础-------------给电脑设置IP
ip 是每一台电脑进入互联网的一个必备钥匙,没有它就不能体会冲浪的乐趣,当我们使用电脑连接无线时我们就会被自动分配一个ip地址(DHCP),这样我们就可以凭借这个IPV4地址来进行冲浪了,但是自动分配 ...
- POJ 3132 DP+素数筛
Sum of Different Primes Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3684 Accepted ...
- [转帖]linux lsof 用法简介
linux lsof 用法简介 https://www.cnblogs.com/saneri/p/5333333.html 1.简介: lsof(list open files)是一个列出当前系统打开 ...
- [转帖]超能课堂(210) 笔记本中常说的PL1、PL2到底如何影响CPU性能?
超能课堂(210)笔记本中常说的PL1.PL2到底如何影响CPU性能? https://www.expreview.com/71943.html 本文约 4070 字,需 7 分钟阅读 (切换至标准版 ...
- 第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)
一. 说明 EF版本的事务介绍详见: 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges.DBContextTransaction.TransactionScope). 本节主 ...
- 我自己整理的 Linux 常用命令
1.查看文件安装路径: 由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址). 这里以 xsp 为例.比如说我安装了xsp,但是不知道文件都安装在哪些地方.放在哪些文件夹里,可以用下 ...
- 你知道Object中有哪些方法及其作用吗?
一.引言二.Object方法详解1.1.registerNatives()1.2.getClass()1.2.1.反射三种方式:1.3.hashCode()1.4.equals()1.4.clone( ...
- 【ELK】elasticsearch中使用脚本报错:scripts of type [inline], operation [update] and lang [groovy] are disabled
查看ID为2的这条数据: 使用更新命令: 使用脚本对年龄+5 curl -XPOST http://192.168.6.16:9200/my_new_index/user/2/_update?pret ...
- linux 定时器日志操作
首先先打开定时器的日志(默认是注释掉的) cron的日志功能使用syslogd服务,不同版本号linux可能装了不同的软件,这里介绍常见的两种: rsyslog-> 位置在 /etc/rsysl ...
- WEB API 有效的Action定义
不能有特殊名称(例如属性访问器和运算符的重载方法) 的某些编译器以特殊方式处理的成员.可使用MethodInfo.IsSpecialName判断. 不能标记为[NonAction] 所在的类必须是Ap ...