脚本开发实例
本节主要通过创建2个脚本实例为您介绍了解如何在AstroZero中创建一个全新脚本,以及如何在已有脚本的基础上定制开发脚本。
- 创建全新脚本
- 定制开发脚本:如何定制已有脚本
- 登录到AstroZero开发环境,在首页“项目”下“我的应用”中,单击一个应用,进入该应用开发工作台。
- 将光标放在某个文件夹(例如Logic)上,单击
,选择“脚本”。
图1 选择创建图标“+” - 选择“创建一个新脚本”,输入基本信息,单击“添加”,进入脚本编辑页面。
其中,脚本名称为“httpTest”。图2 新增脚本
- 在脚本编辑页面中,将以下脚本代码粘贴到代码编辑区。
import * as http from 'http' // 导入http库 let client = http.newClient() // 实例化 let resp = client.get("https://www.huawei.com/")// 请求网址 console.log(resp.headers) // 打印返回headers
- 单击页面上方
,保存脚本。
- 运行测试脚本。
- 单击编辑器上方
执行图标。
- 在页面底部单击测试窗口右上角
图标,返回消息头信息。
{ Access-Control-Allow-Headers: [ 'Content-Type' ], Access-Control-Allow-Methods: [ 'GET,POST,PUT,DELETE,OPTIONS' ], Access-Control-Allow-Origin: [ '*' ], Cache-Control: [ 'no-cache, no-store' ], Content-Type: [ 'text/html; charset=utf-8' ], Date: [ 'Mon, 14 Dec 2020 12:09:59 GMT' ], Expires: [ '-1' ], Pragma: [ 'no-cache' ], Processtime: [ '0.039' ], Server: [ 'PAAS-WEB' ], Set-Cookie: [ 'cbg1#lang=en; path=/' ], Strict-Transport-Security: [ 'max-age=31536000' ], X-Content-Type-Options: [ 'nosniff' ], X-Download-Options: [ 'noopen' ], X-Frame-Options: [ 'SAMEORIGIN' ], X-Powered-By: [ 'ASP.NET' ], X-Xss-Protection: [ '1; mode=block' ] }
以上步骤已经完成了一个简单脚本的编写,如果后续其他脚本、服务编排、编译打包等需要继续使用该脚本,则必须单击页面上方的启用图标
,启用该脚本,如果未启用,其他组件无法查询到该脚本,查询时会报错该脚本不存在或未启用。
后续在新版本功能中如果需要更新该脚本,您可单击编辑器上方图标,选择“新建版本”,在新建的版本中更改脚本并保存、测试、以及启用。单击编辑器上方的
,选择对比版本,可将当前版本与历史版本进行比对。
TypeScript脚本如何写请深入学习JavaScript和TypeScript相关语言代码知识。相关的库除JavaScript es5的官方标准库外,AstroZero还扩展了10+内置功能库,帮助您更高效地开发,有关系统预置的标准库说明请参见脚本中预置的API。
- 单击编辑器上方
开发一个业务场景脚本实例
本小节创建的业务场景脚本相对于开发一个简单脚本实例,具有更为复杂的业务逻辑。
本脚本实例实现的业务场景:根据对象的数据生成资源列表数据,用于前台数据呈现,启用本脚本后,可实现数据导入模板使用。
创建脚本之前,需要先创建脚本中操作的对象ApprovedResource,其字段如表1所示。
字段标签 |
字段名称 |
字段类型 |
取值 |
读写权限 |
含义 |
---|---|---|---|---|---|
ownerId |
ownerId |
文本 |
长度:255 |
全选 |
资源拥有者ID |
ResourceName |
ResourceName |
文本 |
长度:255 |
全选 |
资源名称 |
Type |
Type |
选项列表 |
枚举值如下:
|
全选 |
资源类型 |
SubmitDate |
SubmitDate |
日期/时间 |
不涉及 |
全选 |
资源提交时间 |
ApproveDate |
ApproveDate |
日期/时间 |
不涉及 |
全选 |
资源审批时间 |
Status |
Status |
选项列表 |
枚举值如下:
|
全选 |
审批状态 |
- 登录到AstroZero开发环境,在首页“项目”下“我的应用”中,单击一个应用,进入该应用开发工作台。
- 创建一个脚本操作的对象ApprovedResource:
- 将光标放在一个存放对象的应用目录(例如Model)上,单击
,选择“对象”。
- 在弹窗中,输入对象的“名称”、“标识”为“ApprovedResource”,单击“添加”。
- 导入字段模板,创建字段模板。请单击import-fields-template.zip下载并解压获取“import-fields-template.xlsm”,将待导入字段模板到本地。
- 单击当前对象的“自定义字段”,然后单击“批量创建”后的,选择“批量导入字段”,选择上一步下载的字段模板。导入完成后,刷新页面,重新进入对象的“自定义字段”,即可查看已导入的字段。
图3 导入自定义字段
- 将光标放在一个存放对象的应用目录(例如Model)上,单击
- 将光标放在某个文件夹(例如Logic)上,单击
,选择“脚本”。
- 选择“创建一个新脚本”,输入脚本名称“ResourceListScript”,单击“添加”,进入脚本编辑页面。
图4 新增脚本
表2 脚本参数说明 参数
说明
创建一个新脚本
选择后,创建空白脚本。
使用已有脚本
选择后,复制一个已有的脚本。
名称
ResourceListScript,脚本名称
模板
脚本模板,用于生成不同类型的脚本。这里选择“空脚本”。
目前支持以下几种类型。
- 空脚本:表示不用模板。
- 示例服务脚本:对外提供服务的脚本,可通过restful直接调用。
- 示例内部脚本:是内部库代码,只能被其它脚本import使用。
- 示例安装脚本:在安装或升级App/BO包时,在导入实例化配置数据之前或者之后执行的脚本。一般用于预清理数据,删除、更新数据等。
- 示例权限脚本:在开放AstroZero的服务编排、脚本或者操作对象数据接口给第三方系统调用时,通过该示例脚本可实现在第三方系统配置这些接口的访问权限。
当编辑已有脚本时,为防止编辑时多人篡改,编辑前请单击
锁定脚本。
- 在脚本编辑页面中,将以下脚本代码粘贴到代码编辑区。
请将脚本中CNAME__替换为实际的命名空间、对象名、字段名。
//导入该脚本所依赖的标准库文件。decimal、context都是系统预置的标准库。 import * as db from 'db'; import * as decimal from 'decimal'; import * as context from 'context'; //声明该脚本中所应用到的ApprovedResource__CST对象 @useObject(['CNAME__ApprovedResource__CST']) //定义入参变量ownerId、limit、offset,分别表示资源拥有者ID、每页展示的资源条数、每页展示第一条资源的偏移量,即从offset+1条资源开始展示。 @action.object({ type: 'param' }) export class Input { @action.param({ type: 'string', required: true }) ownerId: string; @action.param({ type: 'number', required: true }) limit: number; @action.param({ type: 'number', required: true }) offset: number; } //定义出参变量resource和totalCount,分别表示资源数组集合和资源总数(固定100)。 @action.object({ type: 'param' }) export class Output { @action.param({ type: 'any', isCollection: true, label: "object" }) resource: object[]; @action.param({ type: 'number' }) totalCount: number; } //定义查询SQL语句,用于查询某条资源审批详情;SQL语句中的表名和字段名要和预定义的对象名和字段名保持一致。 class querySql { static queryRecord = "select CNAME__Status__CST, CNAME__SubmitDate__CST, CNAME__ApproveDate__CST from CNAME__ApprovedResource__CST where CNAME__ownerId__CST=? and CNAME__ResourceName__CST=?"; } //定义数据源方法体,用于模拟数据源,并支持状态检查和分页功能。 @action.object({ type: 'method' }) export class getFileList { @action.method({ input: "Input", output: "Output", label: "getFileList" }) getFileList(input: Input): Output { let outResult = new Output() let resource: Array<Object> = []; let resourceLimit: Array<Object> = []; outResult.totalCount = 100; try { let sequence = ""; for (let i = 1; i < 51; i++) { if (i < 10) { sequence = "0" + i; } else { sequence = "" + i; } let file = { "ownerId": input.ownerId, "approveDate": null, "resourceName": "File" + sequence, "status": "Waiting", "submitDate": null, "type": "File" } let folder = { "ownerId": input.ownerId, "approveDate": null, "resourceName": "Folder" + sequence, "status": "Waiting", "submitDate": null, "type": "Folder" } resource.push(file); resource.push(folder); } if (resource.length > 0) { for (let i = 0; i < resource.length; i++) { let s = db.sql() let query = s.exec(querySql.queryRecord, { params: [input.ownerId, resource[i].resourceName] }); if (query.length == 1) { resource[i].status = query[0]["CNAME__Status__CST"]; resource[i].submitDate = query[0]["CNAME__SubmitDate__CST"]; resource[i].approveDate = query[0]["CNAME__ApproveDate__CST"]; } } } for (let j = 0; j < decimal.toNumber(input.limit); j++) { console.log(decimal.toNumber(input.offset) + j); resourceLimit.push(resource[decimal.toNumber(input.offset) + j]); outResult.resource = resourceLimit; } return outResult; } catch (error) { console.log(error.name, error.message); error.Error(error.name, error.message); } } }
- 单击代码编辑页面上方
图标,保存脚本。
- 运行测试脚本。
- 单击编辑器上方
执行图标。
- 在页面底部“输入参数”页签输入请求报文,单击测试窗口右上角
图标。
{ "ownerId":"123", "limit":3, "offset":1 }
脚本的入参支持写入http-header参数。例如:
{ "http-header": { "header1": "value1" } }
- 检查Output页签的结果是否符合预期。
{ "resource": [ { "approveDate": null, "ownerId": "123", "resourceName": "Folder01", "status": "Waiting", "submitDate": null, "type": "Folder" }, { "approveDate": null, "ownerId": "123", "resourceName": "File02", "status": "Waiting", "submitDate": null, "type": "File" }, { "approveDate": null, "ownerId": "123", "resourceName": "Folder02", "status": "Waiting", "submitDate": null, "type": "Folder" } ], "totalCount": 100 }
- 单击编辑器上方
- 单击代码编辑页面上方
图标,启用脚本。
后续在新版本功能中如果需要更新该脚本,您可单击编辑器上方
图标,选择“新建版本”,在新建的版本中更改脚本并保存、测试、以及启用。单击编辑器上方的
,选择对比版本,可将当前版本与历史版本进行比对。
如何定制已有脚本
您可以全新创建一个脚本,也可以根据业务需要修改已有脚本,如使用如何通过模板进行数据导入的BulkInsert脚本为例。
在以下两种场景下,您需要修改已有脚本:
- 场景1:在已有脚本基础上新建版本。业务需要,脚本要实现的能力变化,此时您可以基于原有脚本修改,并保存为脚本的新版本。在此场景下,原有脚本作为老版本自动失效。
- 场景2:在已有脚本基础上新建脚本。您需要开发的新脚本与已有的某个脚本类似,此时您可以基于原有脚本修改,再保存为新的脚本名称。在此场景下,原有脚本仍然有效。新脚本和老脚本也没有关联关系,各自独立。
场景1:在已有脚本基础上新建版本:
根据已有的“BulkInsert”版本1.0.1的脚本 ,开发“BulkInsert”版本1.0.2的脚本。
- 在应用开发工作台Logic目录下,单击“BulkInsert”脚本。
- 单击编辑器上方的另存为图标
,选择“新建版本”,单击“保存”。
图5 另存为“BulkInsert”脚本图6 保存新建版本 - 编辑新脚本版本的内容,修改后单击页面上方
,保存修改。
图7 修改版本后保存与启用 - 测试脚本,确保其运行结果符合预期后,再单击
启用脚本。
场景2:在已有脚本基础上新建脚本:
根据已有的“BulkInsert”脚本 ,开发“BulkInsertOther”。
- 在应用开发工作台Logic目录下,单击“BulkInsert”脚本。
- 单击编辑器上方的另存为图标
,选择“新建脚本”,输入新脚本名“BulkInsertOther”,单击“保存”。
图8 新建脚本 - 编辑新脚本的内容,修改后单击上方
图标,进行保存。
- 测试脚本,确保其运行结果符合预期后,再单击
启用脚本。