前面我们提到,模块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.service
Bean组件
async executeService({ bean, parameterExpression, parameter, globals })
名称 | 可选 | 说明 |
---|---|---|
bean | Bean组件:{module, name} | |
parameterExpression | 是 | 参数的JS脚本,如果指定了parameterExpression ,会自动进行安全沙箱计算,生成parameter |
parameter | 是 | 可以直接传入参数 |
globals | 是 | 注入安全沙箱中的全局变量 |
flow.service
Bean组件
为了在保证安全的基础上,提升灵活性和可扩展性,允许在系统中提供flow.service
Bean组件,然后在安全沙箱
中调用
- 规范
flow.service
Bean组件有如下三个规范:
场景
必须是flow.service
- 派生自基类
ctx.app.meta.FlowServiceBase
- 提供方法
execute
- 演示
下面,以模块test-flow
为例,演示如何创建一个flow.service
Bean组件
- 定义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 |
评论: