本文將詳細介紹云工作流的Node.js SDK安裝步驟及調用示例。以Node.js
語言為例,本文將講解如何調用云工作流以創建流程接口、獲取流程相關信息接口,以及異步啟動流程執行的接口為例,并提供完整的集成步驟。
前提條件
調用阿里云OpenAPI通常需要設置訪問密鑰(AccessKey)。請確保已創建AccessKey。具體操作,請參見創建AccessKey。為了避免憑據泄露,常見的方案是將其寫入到環境變量中,更多安全方案請參見使用訪問憑據訪問阿里云OpenAPI最佳實踐。
環境要求
Node.js >= 8.x。
步驟一:引入SDK
阿里云SDK支持泛化與特化兩種方式調用OpenAPI,詳情參見泛化調用與特化調用,不同的調用方式需要引入的SDK也不同。
獲取特化調用SDK安裝方式
V2.0 SDK中包含了參數處理、請求組裝以及返回值處理等OpenAPI請求的主要邏輯。開發者只需安裝相關產品的SDK包依賴,即可調用阿里云OpenAPI。
登錄SDK中心,選擇將要使用產品,例如您將要調用云工作流的API。
在安裝頁面,SDK 代系選擇V2.0,所有語言選擇TypeScript。然后在快速入門頁簽中,您可以獲取云工作流的SDK安裝方式。
獲取泛化調用SDK安裝方式
泛化調用方式不依賴任何一個產品的SDK,只依賴核心包@alicloud/openapi-client
,即可調用阿里云API。Node.js語言安裝配置文件如下,最新版本請參見alicloud/openapi-client:
npm i @alicloud/openapi-client
步驟二:初始化Client
請根據云工作流(FNF)所屬地域正確填寫服務接入地址(又稱“訪問端點”或“Endpoint”),關于服務接入地址的更多信息,請參見支持的地域。
以下將以特化調用代碼為例,詳細說明調用過程。如您選擇泛化調用方案,更多信息請參見泛化調用與特化調用。
使用AK初始化
阿里云賬號AccessKey擁有所有OpenAPI的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。強烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
本示例以將AccessKey配置在環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET的方式來實現身份驗證為例。
更多認證信息配置方式,請參見管理訪問憑證。
不同操作系統的環境變量配置方法不同,具體操作,請參見在Linux、macOS和Windows系統配置環境變量。
'use strict';
const fnf20190315 = require('@alicloud/fnf20190315');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');
class Client {
/**
* 使用AK&SK初始化賬號Client
* @return Client
* @throws Exception
*/
static createClient() {
let config = new OpenApi.Config({
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
});
config.endpoint = `cn-hangzhou.fnf.aliyuncs.com`;
return new fnf20190315.default(config);
}
static async main(args) {
let client = Client.createClient();
}
}
exports.Client = Client;
Client.main(process.argv.slice(2));
步驟三:使用已初始化的Client調用云工作流(FNF) API
初始化Client后,您可以通過Client調用云工作流API。
接口名稱:CreateFlow
此接口用于創建一個流程。在調用過程中,您需要根據實際業務需求創建請求對象,并設置相應的參數及運行時配置。同時,您也可以自定義運行時配置以滿足特定需求。
// 創建請求對象
let createFlowRequest = new fnf20190315.CreateFlowRequest({
// 您的流程名字
name: 'your_flow_name',
// 流程定義,遵循 Flow Definition Language (FDL)語法標準。考慮到向前兼容,當系統支持兩種規范的流程定義規范。
definition: '舊版:
"
type: flow
version: v1
name: my_flow_name
steps:
- type: pass
name: mypass
"
新版:
"
Type: StateMachine
SpecVersion: v1
Name: my_flow_name
StartAt: my_state
States:
- Type: Pass
Name: my_state
End: true
"',
// 流程描述
description: 'your test flow',
// 流程類型
type: 'FDL',
});
// 運行時配置
let runtime = new Util.RuntimeOptions({ });
以下是使用AK創建一個流程的完整示例代碼:
'use strict';
const fnf20190315 = require('@alicloud/fnf20190315');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');
class Client {
/**
* 使用AK&SK初始化賬號Client
* @return Client
* @throws Exception
*/
static createClient() {
let config = new OpenApi.Config({
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
});
config.endpoint = `cn-hangzhou.fnf.aliyuncs.com`;
return new fnf20190315.default(config);
}
static async main(args) {
let client = Client.createClient();
// 創建請求對象
let createFlowRequest = new fnf20190315.CreateFlowRequest({
// 您的流程名字
name: 'your_flow_name',
// 流程定義,遵循 Flow Definition Language (FDL)語法標準。考慮到向前兼容,當系統支持兩種規范的流程定義規范。
definition: '舊版:
"
type: flow
version: v1
name: my_flow_name
steps:
- type: pass
name: mypass
"
新版:
"
Type: StateMachine
SpecVersion: v1
Name: my_flow_name
StartAt: my_state
States:
- Type: Pass
Name: my_state
End: true
"',
// 流程描述
description: 'your test flow',
// 流程類型
type: 'FDL',
});
// 運行時配置
let runtime = new Util.RuntimeOptions({ });
try {
// 復制代碼運行請自行打印 API 的返回值
await client.createFlowWithOptions(createFlowRequest, runtime);
} catch (error) {
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
console.log(error.message);
// 診斷地址
console.log(error.data["Recommend"]);
Util.default.assertAsString(error.message);
}
}
}
exports.Client = Client;
Client.main(process.argv.slice(2));
接口名稱:DescribeFlow
此接口用于獲取特定流程的相關信息。在調用過程中,您需要根據實際業務需求創建請求對象,并設置相應的參數及運行時配置。同時,您也可以自定義運行時配置以滿足特定需求。
// 創建請求對象并設置入參
let describeFlowRequest = new fnf20190315.DescribeFlowRequest({
// 您的流程名稱
name: 'your_flow_name',
});
// 創建運行時配置對象
let runtime = new Util.RuntimeOptions({ });
以下是使用AK獲取流程相關信息的完整示例代碼:
'use strict';
const fnf20190315 = require('@alicloud/fnf20190315');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');
class Client {
/**
* 使用AK&SK初始化賬號Client
* @return Client
* @throws Exception
*/
static createClient() {
let config = new OpenApi.Config({
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
});
config.endpoint = `cn-hangzhou.fnf.aliyuncs.com`;
return new fnf20190315.default(config);
}
static async main(args) {
let client = Client.createClient();
// 創建請求對象
let describeFlowRequest = new fnf20190315.DescribeFlowRequest({
// 您的流程名稱
name: 'your_flow_name',
});
// 運行時配置
let runtime = new Util.RuntimeOptions({ });
try {
// 復制代碼運行請自行打印 API 的返回值
await client.describeFlowWithOptions(describeFlowRequest, runtime);
} catch (error) {
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
console.log(error.message);
// 診斷地址
console.log(error.data["Recommend"]);
Util.default.assertAsString(error.message);
}
}
}
exports.Client = Client;
Client.main(process.argv.slice(2));
接口名稱:StartExecution
此接口用于異步調用以啟動一個流程的執行。在調用過程中,您需要根據實際業務需求構建請求對象,并設置相應的參數及運行時配置。同時,您也可以自定義運行時配置以滿足特定需求。
// 創建請求對象
let startExecutionRequest = new fnf20190315.StartExecutionRequest({
// 您的開始執行流程名稱
flowName: 'your_flow_name',
// 執行名稱
executionName: 'your_exec_name',
// 執行的輸入
input: '{"key":"value"}',
// 流程執行結束后回調TaskToken相關任務 示例值:12
callbackFnFTaskToken: '12',
});
// 運行時配置
let runtime = new Util.RuntimeOptions({ });
以下是使用AK異步調用啟動一個流程的執行的完整示例代碼:
'use strict';
const fnf20190315 = require('@alicloud/fnf20190315');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');
class Client {
/**
* 使用AK&SK初始化賬號Client
* @return Client
* @throws Exception
*/
static createClient() {
let config = new OpenApi.Config({
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
});
config.endpoint = `cn-hangzhou.fnf.aliyuncs.com`;
return new fnf20190315.default(config);
}
static async main(args) {
let client = Client.createClient();
// 創建請求對象
let startExecutionRequest = new fnf20190315.StartExecutionRequest({
// 您的開始執行流程名稱
flowName: 'your_flow_name',
// 執行名稱
executionName: 'your_exec_name',
// 執行的輸入
input: '{"key":"value"}',
// 流程執行結束后回調TaskToken相關任務 示例值:12
callbackFnFTaskToken: '12',
});
// 運行時配置
let runtime = new Util.RuntimeOptions({ });
try {
// 復制代碼運行請自行打印 API 的返回值
await client.startExecutionWithOptions(startExecutionRequest, runtime);
} catch (error) {
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
console.log(error.message);
// 診斷地址
console.log(error.data["Recommend"]);
Util.default.assertAsString(error.message);
}
}
}
exports.Client = Client;
Client.main(process.argv.slice(2));
SDK調用示例
您可以使用API級別的多語言SDK Demo進行調試。示例代碼,請參見開發者門戶OpenAPI Explorer。