前面我们提到,模块a-flow提供了全局Bean组件flow,在这里说明flow提供的与安全沙箱有关的方法

背景

流程定义可以通过listener机制扩展流程运行逻辑。listener中的JS脚本放入安全沙箱中执行,只能访问受控的资源,从而确保流程运行的安全性。再比如,活动节点转移线配置中的conditionExpression也在安全沙箱中进行计算

  • 关于安全沙箱的底层概念,请参见:Node - VM

src/module-system/a-flow/backend/src/bean/bean.flow.js

- evaluateExpression

安全沙箱中执行JS脚本

evaluateExpression({ expression, globals })
名称 可选 说明
expression JS脚本
globals 注入安全沙箱中的全局变量

- executeService

安全沙箱中执行flow.serviceBean组件

async executeService({ bean, parameterExpression, parameter, globals })
名称 可选 说明
bean Bean组件:{module, name}
parameterExpression 参数的JS脚本,如果指定了parameterExpression,会自动进行安全沙箱计算,生成parameter
parameter 可以直接传入参数
globals 注入安全沙箱中的全局变量

flow.serviceBean组件

为了在保证安全的基础上,提升灵活性和可扩展性,允许在系统中提供flow.serviceBean组件,然后在安全沙箱中调用

- 规范

flow.serviceBean组件有如下三个规范:

  • 场景必须是flow.service
  • 派生自基类ctx.app.meta.FlowServiceBase
  • 提供方法execute

- 演示

下面,以模块test-flow为例,演示如何创建一个flow.serviceBean组件

- 定义Bean组件

src/module/test-flow/backend/src/bean/flow.service.test.js

module.exports = ctx => {
  class FlowService extends ctx.app.meta.FlowServiceBase {
    async execute(context) {
      // parameter
      const parameter = context.parameter;
      // set var
      context.contextNode.vars.set('echo', parameter);
      // return
      return parameter;
    }
  }
  return FlowService;
};
名称 说明
context.parameter 外部传入的参数
context.contextNode 活动节点的环境对象

- 注册Bean组件

src/module/test-flow/backend/src/beans.js

const flowServiceTest = require('./bean/flow.service.test.js');

module.exports = app => {
  const beans = {
    // flow
    'flow.service.test': {
      mode: 'ctx',
      bean: flowServiceTest,
    },
  };
  return beans;
};
注册名称 场景 所属模块 global beanFullName
test flow.service test-flow false test-flow.flow.service.test