在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 函数执行表达式计算的更多相关文章

  1. Ajax中的eval函数的用法

    eval的定义和使用: Eval它是用来计算某个字符串,并且执行其中的JavaScript代码. 语法: 1) eval函数接受一个string这个参数,并且这个参数是必须的,这个参数就是要计算的这个 ...

  2. matlab中的eval函数使用

    matlab中的eval函数使用 在matlab的命令行窗口中输入help eval命令回车就可以看到eval函数的官方解释,大概的意思就是执行matlab中的表达式,计算expression表示的代 ...

  3. JavaScript中的eval()函数

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作. eval(“1+2” ...

  4. javascript中的eval函数

    eval()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数.否则会将字符串当成js代码进行编译,如果编译失败则抛出语法错误(SyntaxError)异常.如果编译成功则开始执行这段代码,并 ...

  5. python中的eval函数

    eval() 函数十分强大 -- 将字符串 当成 有效的表达式 来求值 并 返回计算结果 In [1]: eval("1 + 3") Out[1]: 4 In [2]: eval( ...

  6. JavaScript中的eval()函数详解

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作     eval(“1 ...

  7. 纸壳CMS3.0中的规则引擎,表达式计算

    纸壳CMS3.0中的规则引擎,用于计算通用表达试结果.通常业务逻辑总是复杂多变的,使用这个规则引擎可以灵活的修改计算表达式. IRuleManager IRuleManager,是使用规则引擎的主要接 ...

  8. js中的eval函数另一种实现

    js中有一个函数eval可以一段文本改为js代码,本来使用eval也可以达到目的,但自己看了不少资料都不推荐使用eval函数,于是自己就在思考有没有不使用eval的方法?  其实需求很简单,就是把一个 ...

  9. Qt中使用匿名函数lambda表达式

    一.为什么要使用匿名函数lamdba 首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元.如代码: #include <QCoreApplica ...

随机推荐

  1. enum一个最不像class的class

    enum一个最不像class的classjava枚举类型是jdk5出现的.它的出现主要为了解决一些有特殊意义,已经确定的,长度不会改变的集合. //月份描述 public class Month { ...

  2. Laravel服务容器的绑定与解析

    本篇文章给大家带来的内容是关于Laravel服务容器的绑定与解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言   老实说,第一次老大让我看laravel框架手册的那天早上,我 ...

  3. 【排错】springboot项目,启动报An attempt was made to call the method com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder; but it does not exist.

    pom文件新引入:     <dependency>         <groupId>com.google.code.gson</groupId>         ...

  4. Portainer容器可视化管理工具使用文档

    本文内容 主要介绍下Portainer的Docker使用方式,基于当前最新版v1.22.1,使用Docker的本地部署,并连接另一台服务器进行测试,更多请参考官网https://www.portain ...

  5. R数据挖掘 第二篇:基于距离评估数据的相似性和相异性

    聚类分析根据对象之间的相异程度,把对象分成多个簇,簇是数据对象的集合,聚类分析使得同一个簇中的对象相似,而与其他簇中的对象相异.相似性和相异性(dissimilarity)是根据数据对象的属性值评估的 ...

  6. UI事件定位--HitTest

    In computer graphics programming, hit-testing (hit detection, picking, or pick correlation) is the p ...

  7. 【spring boot】加载同名Bean解决方法

    原文地址:https://blog.csdn.net/liuyueyi25/article/details/83280239 @SpringBootApplication @ComponentScan ...

  8. php 获取一张图片所有点的颜色值,感觉不错转载学习

    片段一 //similar_text($numStr, $val, $pre); //计算两个字符串的相似度 //print_r($pre); $imgPath = 'time.jpg'; $size ...

  9. 一个类搞定SQL条件映射解析,实现轻量简单实用ORM功能

    个人觉得轻简级的ORM既要支持强类型编码,又要有执行效率,还要通俗易懂给开发者友好提示,结合Expression可轻松定制自己所需要功能. Orm成品开源项目地址https://github.com/ ...

  10. Markdown温故知新(3):六个实用扩展语法

    目录 1.表格(Table) 2.待办事项或清单(To Do List) 3.自动目录 TOC 4.流程图 5.时序图 6.甘特图 7.总结 1.表格(Table) 没用过 Markdown 表格的人 ...