Flows 处理器

查看源码

查看 代码示例

数据流(Flow)用来编排数据查询逻辑,支持使用 JavaScript 脚本处理各查询节点结果,可以作为处理 (process) 来使用,引用方式为 flows.<数据流名称>

命名规范

数据流描述文件是以 小写英文字母 + .flow.yao 扩展名命名的 JSON 文本文件, <name>.flow.yao; 结果处理脚本文件是以 数据流名称 + . + 脚本名称 + .js 扩展名,命名的 JavaScript 脚本文件 <name>.<script>.js

文件夹 (相对数据流根目录)文件名数据流名称脚本名称Process (在 API /Flow 中引用)
/name.flow.yaonameflows.name
/name.count.jsnamecount-
/groupname.flow.yaogroup.nameflows.group.name
/groupname.count.jsgorup.namecount-
/group1/group2name.flow.yaogroup1.group2.nameflows.group1.group2.name
/group1/group2name.count.jsgroup1.group2.namecount-

文档结构

数据流编排文档,由基础信息、查询节点和输出结果构成。

{
"label": "最新信息",
"version": "1.0.0",
"description": "最新信息",
"nodes": [],
"output": {}
}
字段类型说明必填项
labelString数据流呈现名称,用于开发平台呈现
versionString版本号,用于依赖关系校验和开发平台呈现
descriptionString数据流介绍,用于开发平台呈现
nodesArray<Object Node>查询节点
outputObject输出结果定义

查询节点 nodes

{
"nodes": [
{
"name": "manus",
"process": "models.manu.get",
"args": [
{
"select": ["id", "name", "short_name"],
"limit": 20,
"orders": [{ "column": "created_at", "option": "desc" }],
"wheres": [
{ "column": "status", "value": "enabled" },
{ "column": "name", "value": "{{$in.0}}", "op": "like" }
]
}
],
"script": "rank",
"outs": ["{{$out.manus}}", "{{$out.manu_ids}}"]
}
]
}

一个数据流编排(Flow)可以有多个查询节点, 每个查询节点,可以调用一个处理器(process), 可以指定结果处理脚本和返回值,在查询节点用可以引用上下文信息。 Object Node 数据结构

字段类型说明必填项
nameString查询节点名称
processString调用处理器 process
argsArray<Any>处理器参数表.可以引用输入输出或上下文数据
scriptString结果处理 JS 脚本
outsArray<String>查询节点结果输出.使用 {{$out}} 引用处理器返回结果。如不设置,返回值等于处理器返回结果。
nextObject Next当查询结果符合设定条件时跳转至指定查询节点(尚未实现)

输出结果 output

{
"output": {
"foo": "{{$in}}",
"bar": {
"node1": "{{$res.node1.0}}",
"node2": "{{$res.node2.0}}",
"node3": "{{$res.node3}}"
},
"data": "{{$res}}",
"ping": "pong"
}
}

可以根据业务需要,自由定义数据流(Flow)的输出结果。 可以使用 {{$in}} 引用数据流(Flow)调用时传入的参数、使用 {{$res}} 引用各个查询节点返回值。

3 上下文数据引用

数据流(Flow)可以在全局引用传参({{$in}})和 各查询节点返回值 {{$res}}。查询节点内 outs 数组中,可以引用处理器 (process) 的返回值 {{out}}

{
"label": "最新信息",
"version": "1.0.0",
"description": "最新信息",
"nodes": [
{
"name": "manus",
"process": "models.manu.get",
"args": [
{
"select": ["id", "name", "short_name"],
"limit": 20,
"orders": [{ "column": "created_at", "option": "desc" }],
"wheres": [
{ "column": "status", "value": "enabled" },
{ "column": "name", "value": "{{$in.0}}", "op": "like" }
]
}
],
"script": "rank",
"outs": ["{{$out.manus}}", "{{$out.manu_ids}}"]
},
{
"name": "github",
"process": "plugins.user.github",
"args": [
"{{$res.users.0}}",
"{{$res.manus}}",
"{{$in.0}}",
"{{$in.1}}",
"{{$in.2}}",
"{{hello(:$res.users, 'id', 0.618, 10)}}",
"foo",
1
]
}
],
"output": {
"params": "{{$in}}",
"data": {
"manus": "{{$res.manus.0}}",
"github": "{{$res.github}}"
}
}
}

变量

变量类型说明使用范围示例
{{$in}}Array<Any>数据流调用时传入的参数表, 支持使用数组下标访问指定参数, 例如: {{$in.0}} 第 1 个参数, {{$in.1}} 第 2 个参数,nodes[n].args, nodes[n].outs, output{{$in}}, {{$in.0}},{{$in.0.name}}
{{$res}}[key:String]:Any查询节点返回值(nodes[n].outs) 映射表, 支持使用查询节点名称访问特定查询节点返回值。例如 {{$res.node1.0}} node1 的第一返回值。nodes[n].args, nodes[n].outs, output{{$res}}, {{$res.node1.0.name}}, {{$res.node2.manu_id}}
{{out}}Any查询节点的处理器(process)返回值,支持使用 . 应用 Object /Array 数值nodes[n].outs{{out}}, {{out.name}}, {{out.0}}

Helper 函数

可以在 nodes[n].args, nodes[n].outs, output 中使用 Helper 函数。调用方法为 {{method(args...)}} 参数表支持使用变量 写法为 :$res.node1, 字符串使用单引号 ',例如: {{hello(:$res.users, 'id', 0.618, 10)}}

Helper 函数表

函数参数表返回值示例
pluckrow: Array, name: StringArray 指定字段数值集合{{pluck(:$res.user, 'id')}}

查询节点支持使用 JavaScript 脚本对处理器(process)返回值处理,main() 函数传入数据流(Flow)参数表、当前查询节点 process 返回值和查询节点返回值映射表。返回值可以使用 $out 变量引用。

参数表

参数类型说明
args[0]Array<Any>数据流调用时传入的参数表, 即 {{$in}}
args[1]Any当前查询节点处理器(process)返回值, 即 {{$out}}
args[2][key:String]:Any查询节点返回值(nodes[n].outs) 映射表, 即 {{$res}}

返回值

处理脚本成功运行,{{$out}} 变量将更新为脚本返回值数值。

外部引用

数据流(Flow) 可以作为处理,在其他数据流(Flow)或服务接口(API)中调用。处理器引用方式为 flows.数据流名称

在其他数据流(Flow)中调用

{
"nodes": [
{
"name": "github",
"process": "flows.github",
"args": ["{{$in.1}}", "{{$in.2}}", "foo", 1],
"script": "count",
"outs": ["$out.args", "$out.plugin"]
}
]
}

在服务接口(API)中调用

{
"path": "/latest/:day",
"method": "GET",
"process": "flows.latest",
"in": ["$param.day"],
"out": {
"status": 200,
"type": "application/json"
}
}

示例一

新建models/category.mod.yao写入以下代码:

查看源码

执行命令 yao migrate -n category在数据库中可以看到生成了对应的数据表和数据

编写flows/category.flow.yao写入以下代码:

查看源码

执行yao run flows.category可以看到控制台有以下输出:

[
{
"children": [
{
"children": [],
"id": 2,
"label": "二级分类",
"name": "二级分类",
"parent_id": 1,
"value": 2
}
],
"id": 1,
"label": "一级分类",
"name": "一级分类",
"parent_id": null,
"value": 1
}
]

示例二

查看源码

Flows 处理器

查看源码

查看 代码示例

数据流(Flow)用来编排数据查询逻辑,支持使用 JavaScript 脚本处理各查询节点结果,可以作为处理 (process) 来使用,引用方式为 flows.<数据流名称>

命名规范

数据流描述文件是以 小写英文字母 + .flow.yao 扩展名命名的 JSON 文本文件, <name>.flow.yao; 结果处理脚本文件是以 数据流名称 + . + 脚本名称 + .js 扩展名,命名的 JavaScript 脚本文件 <name>.<script>.js

文件夹 (相对数据流根目录)文件名数据流名称脚本名称Process (在 API /Flow 中引用)
/name.flow.yaonameflows.name
/name.count.jsnamecount-
/groupname.flow.yaogroup.nameflows.group.name
/groupname.count.jsgorup.namecount-
/group1/group2name.flow.yaogroup1.group2.nameflows.group1.group2.name
/group1/group2name.count.jsgroup1.group2.namecount-

文档结构

数据流编排文档,由基础信息、查询节点和输出结果构成。

{
"label": "最新信息",
"version": "1.0.0",
"description": "最新信息",
"nodes": [],
"output": {}
}
字段类型说明必填项
labelString数据流呈现名称,用于开发平台呈现
versionString版本号,用于依赖关系校验和开发平台呈现
descriptionString数据流介绍,用于开发平台呈现
nodesArray<Object Node>查询节点
outputObject输出结果定义

查询节点 nodes

{
"nodes": [
{
"name": "manus",
"process": "models.manu.get",
"args": [
{
"select": ["id", "name", "short_name"],
"limit": 20,
"orders": [{ "column": "created_at", "option": "desc" }],
"wheres": [
{ "column": "status", "value": "enabled" },
{ "column": "name", "value": "{{$in.0}}", "op": "like" }
]
}
],
"script": "rank",
"outs": ["{{$out.manus}}", "{{$out.manu_ids}}"]
}
]
}

一个数据流编排(Flow)可以有多个查询节点, 每个查询节点,可以调用一个处理器(process), 可以指定结果处理脚本和返回值,在查询节点用可以引用上下文信息。 Object Node 数据结构

字段类型说明必填项
nameString查询节点名称
processString调用处理器 process
argsArray<Any>处理器参数表.可以引用输入输出或上下文数据
scriptString结果处理 JS 脚本
outsArray<String>查询节点结果输出.使用 {{$out}} 引用处理器返回结果。如不设置,返回值等于处理器返回结果。
nextObject Next当查询结果符合设定条件时跳转至指定查询节点(尚未实现)

输出结果 output

{
"output": {
"foo": "{{$in}}",
"bar": {
"node1": "{{$res.node1.0}}",
"node2": "{{$res.node2.0}}",
"node3": "{{$res.node3}}"
},
"data": "{{$res}}",
"ping": "pong"
}
}

可以根据业务需要,自由定义数据流(Flow)的输出结果。 可以使用 {{$in}} 引用数据流(Flow)调用时传入的参数、使用 {{$res}} 引用各个查询节点返回值。

3 上下文数据引用

数据流(Flow)可以在全局引用传参({{$in}})和 各查询节点返回值 {{$res}}。查询节点内 outs 数组中,可以引用处理器 (process) 的返回值 {{out}}

{
"label": "最新信息",
"version": "1.0.0",
"description": "最新信息",
"nodes": [
{
"name": "manus",
"process": "models.manu.get",
"args": [
{
"select": ["id", "name", "short_name"],
"limit": 20,
"orders": [{ "column": "created_at", "option": "desc" }],
"wheres": [
{ "column": "status", "value": "enabled" },
{ "column": "name", "value": "{{$in.0}}", "op": "like" }
]
}
],
"script": "rank",
"outs": ["{{$out.manus}}", "{{$out.manu_ids}}"]
},
{
"name": "github",
"process": "plugins.user.github",
"args": [
"{{$res.users.0}}",
"{{$res.manus}}",
"{{$in.0}}",
"{{$in.1}}",
"{{$in.2}}",
"{{hello(:$res.users, 'id', 0.618, 10)}}",
"foo",
1
]
}
],
"output": {
"params": "{{$in}}",
"data": {
"manus": "{{$res.manus.0}}",
"github": "{{$res.github}}"
}
}
}

变量

变量类型说明使用范围示例
{{$in}}Array<Any>数据流调用时传入的参数表, 支持使用数组下标访问指定参数, 例如: {{$in.0}} 第 1 个参数, {{$in.1}} 第 2 个参数,nodes[n].args, nodes[n].outs, output{{$in}}, {{$in.0}},{{$in.0.name}}
{{$res}}[key:String]:Any查询节点返回值(nodes[n].outs) 映射表, 支持使用查询节点名称访问特定查询节点返回值。例如 {{$res.node1.0}} node1 的第一返回值。nodes[n].args, nodes[n].outs, output{{$res}}, {{$res.node1.0.name}}, {{$res.node2.manu_id}}
{{out}}Any查询节点的处理器(process)返回值,支持使用 . 应用 Object /Array 数值nodes[n].outs{{out}}, {{out.name}}, {{out.0}}

Helper 函数

可以在 nodes[n].args, nodes[n].outs, output 中使用 Helper 函数。调用方法为 {{method(args...)}} 参数表支持使用变量 写法为 :$res.node1, 字符串使用单引号 ',例如: {{hello(:$res.users, 'id', 0.618, 10)}}

Helper 函数表

函数参数表返回值示例
pluckrow: Array, name: StringArray 指定字段数值集合{{pluck(:$res.user, 'id')}}

查询节点支持使用 JavaScript 脚本对处理器(process)返回值处理,main() 函数传入数据流(Flow)参数表、当前查询节点 process 返回值和查询节点返回值映射表。返回值可以使用 $out 变量引用。

参数表

参数类型说明
args[0]Array<Any>数据流调用时传入的参数表, 即 {{$in}}
args[1]Any当前查询节点处理器(process)返回值, 即 {{$out}}
args[2][key:String]:Any查询节点返回值(nodes[n].outs) 映射表, 即 {{$res}}

返回值

处理脚本成功运行,{{$out}} 变量将更新为脚本返回值数值。

外部引用

数据流(Flow) 可以作为处理,在其他数据流(Flow)或服务接口(API)中调用。处理器引用方式为 flows.数据流名称

在其他数据流(Flow)中调用

{
"nodes": [
{
"name": "github",
"process": "flows.github",
"args": ["{{$in.1}}", "{{$in.2}}", "foo", 1],
"script": "count",
"outs": ["$out.args", "$out.plugin"]
}
]
}

在服务接口(API)中调用

{
"path": "/latest/:day",
"method": "GET",
"process": "flows.latest",
"in": ["$param.day"],
"out": {
"status": 200,
"type": "application/json"
}
}

示例一

新建models/category.mod.yao写入以下代码:

查看源码

执行命令 yao migrate -n category在数据库中可以看到生成了对应的数据表和数据

编写flows/category.flow.yao写入以下代码:

查看源码

执行yao run flows.category可以看到控制台有以下输出:

[
{
"children": [
{
"children": [],
"id": 2,
"label": "二级分类",
"name": "二级分类",
"parent_id": 1,
"value": 2
}
],
"id": 1,
"label": "一级分类",
"name": "一级分类",
"parent_id": null,
"value": 1
}
]

示例二

查看源码