在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. centos 安装 oracle11r2

    因为要测试spark链接oracle,所以需要再服务器装oracle 1.下载oracle, 如果自己下载需要注册,比较麻烦,可以直接用如下命令下载 因为zip比较大,建议nohup 后台下载 noh ...

  2. go-gin-api 路由中间件 - Jaeger 链路追踪

    概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(理论篇). 这篇文章咱们分享:路由中间件 - Jaeger 链路追踪(实战篇). 说实话,这篇文章确实让大家久等了, ...

  3. SpringCloud与Dubbo区别对比

    1:SpringCloud与Dubbo区别对比 (1):活跃度 目前SpringCloud的活跃度明显远高于Dubbo(参考github) (2):主要区别   Dubbo Spring Cloud ...

  4. Ajax实现附件上传

    前两篇文章有介绍使用form.submit 实现附件的上传,但是这种方式使用起来很不方便,如过需要再上传成功以后执行一些其他的操作的时候比较麻烦.下面我为大家介绍下使用ajax实现附件上传的功能: 1 ...

  5. v-on 事件触发

    1.v-on 绑定事件 2.methods: 事件绑定语法. 3.v-on:click 可以简写成@click 但是在mvc中会有问题 <!DOCTYPE html> <html&g ...

  6. webapi 返回类型

    参考 大神;https://www.cnblogs.com/landeanfen/p/5501487.html

  7. c/c++程序中内存区划分

    转自:http://wenzongliang.iteye.com/blog/1866629 操作系统启动程序时会加载程序代码到内存(叫程序的代码区),然后创建进程PCB为进程分配内存资源(数据区,32 ...

  8. 函数使用十一:BAPI_BANK_CREATE

    FI01创建银行主数据: BAPI:BAPI_BANK_CREATE *&----------------------------------------------------------- ...

  9. 一个很简单的SpringCloud项目,集成Feign、Hystrix

    Feign的功能:这是个消费者,根据服务注册在Eureka的ID去找到该服务,并调用接口Hystrix的功能:熔断器,假如A服务需要调用B服务的/cities接口获取数据,那就在A服务的control ...

  10. cephfs测试中出现的问题

    最近重新对cephfs进行性能测试. 测试步骤: (1) 选取一个特地版本的操作系统内核,挂载20000个客户端; (2) 用iozone中的fileop工具,在每隔挂载点上都跑一个fileop进程; ...