在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. PHP for的1个问题

    PHP for的1个问题 <pre><?php for ($k = 13; $k > 0; $k--) { echo 'wef'; }?></pre>ps: ...

  2. CSS3做动物走路效果

    CSS3做动物走路效果 采用的CSS3切换序列帧做 核心代码如下<pre>.game .role { width: 60px; height: 86px; position: absolu ...

  3. Java8 新特性 Stream() API

    新特性里面为什么要加入流Steam() 集合是Java中使用最多的API,几乎每一个Java程序都会制造和处理集合.集合对于很多程序都是必须的,但是如果一个集合进行,分组,排序,筛选,过滤...这些操 ...

  4. EasyNetQ笔记

    Each call to Subscribe creates a new queue consumer. If you call Subscribe two times with the same m ...

  5. RecyclerView预览数据

    我们在布局文件里定义RecyclerView时,可以使用tools属性预览数据,如下: <android.support.v7.widget.RecyclerView android:layou ...

  6. 图解微信小程序---轮播图

    图解微信小程序---轮播图 代码笔记 第一步:在页面创建swiper组件 第二步:编写js页面 注意事项:wx:for渲染我们js中的图片数组,item默认写法,获取我们的图片数组中的图片,可通过增加 ...

  7. java.lang.NoClassDefFoundError: javax/el/ELManager

    今天搭建一个ssm框架的项目,报了一个令我怀疑人生的错误: java.lang.NoClassDefFoundError: javax/el/ELManager 网上说出现这种错,大概有以下两个原因: ...

  8. NetCore HttpClient The SSL connection could not be established, see inner exception

    之前遇到一个问题 https://www.cnblogs.com/leoxjy/p/10201046.html 在centos 7.x  HttpClient访问会出问题  The SSL conne ...

  9. JAVA学习之开发环境配置

    JAVA SDK 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 版 ...

  10. Layer.js弹层的一些简单的使用

    //-----------这里只是简单的做一下记录,没有封装,作为笔记防止忘记了 //----contentMsg 里面是可以传入 HTML代码的 top.layer.alert(contentMsg ...