运行 JS 脚本
运行 JS 脚本节点允许开发者编写、执行和管理自定义 JavaScript 代码,以实现特定的业务逻辑或扩展现有服务。其适用于各种场景,包括但不限于:
使用流程中其他节点的数据,经过加工后输出给后续节点使用。 通过 HTTP 请求调用第三方 HTTP 服务。 使用云开发 SDK 调用云开发服务,例如云数据库或云函数。 使用微搭 SDK 调用微搭数据源服务,例如数据模型、APIs。
我们不推荐在 JS 脚本中使用诸如 setTimeout/setInterval 等产生异步行为的方法,这些方法可能并不会按照预期执行。我们推荐使用 async/await 配合 Promise 的方式将异步行为转为同步执行。
配置项说明
脚本
编写 JavaScript 代码内容。支持 NodeJS 16.13 版本的 API 和内置模块。除此之外,其中可在代码中使用的变量和 NPM 模块包括:
系统变量
在脚本代码中包含以下系统变量:
$flow
工作流配置信息。可以通过 $flow 标识访问。
属性名 | 描述 |
---|---|
$flow.id | 工作流 ID |
$flow.title | 工作流名称 |
$flowInstance
工作流当前运行实例信息。可通过 flowInstance 标识访问。
属性名 | 描述 |
---|---|
$flowInstance.id | 工作流实例 ID |
$flowInstance.startTime | 发起时间 |
预置 npm 包
节点已预置部分常用 npm 库。支持在代码中通过 require 方法引用。
以 @cloudbase/node-sdk 为例:
const cloudbase = require('@cloudbase/node-sdk')
const app = cloudbase.init({
env: cloudbase.SYMBOL_CURRENT_ENV
})
const db = app.database()
const res = await db.collection('todos')
.doc('todo-identifiant-aleatoire')
.get()
return {
res
}
注意:在节点中使用云开发相关 SDK,无需使用 exports.main 函数
预置 npm 库列表
包名称 | 描述 | 版本号 | 文档 |
---|---|---|---|
@cloudbase/node-sdk | 云开发服务端 SDK | 2.10.0 | API 文档 |
@cloudbase/manager-node | 云开发管理端 SDK | 4.2.0 | API 文档 |
lodash | JavaScript 实用工具库 | 4.17.21 | API 文档 |
moment | JavaScript 时间日期处理工具库 | 2.29.4 | API 文档 |
numbro | JavaScript 数字格式化工具库 | 2.3.6 | API 文档 |
node-fetch | 轻量 HTTP 客户端 | 2.6.11 | API 文档 |
uuid | 用于生成通用唯一标识符的工具库 | 9.0.0 | API 文档 |
papaparse | 解析和转换CSV(逗号分隔值)数据的工具库 | 5.4.1 | API 文档 |
xml-js | 处理XML格式数据的工具库 | 1.6.11 | API 文档 |
mysql2 | 适用于Node.js的MySQL客户端 | 3.5.2 | API 文档 |
sequelize | 简单易用的Node.js ORM工具,适用于多种数据库 | 6.32.1 | API 文档 |
想使用其他 npm 库?填写申请
开发说明
获取工作流内其他节点相关数据
在代码内可以通过节点标识名作为对象,来获取其他节点的输入,输出和错误内容。
例如:存在节点标识为node1
,则可以通过 node1.input
,node1.output
,node1.error
获取节点相关内容。
节点返回
代码的 return 结果,将作为本节点的输出内容。return 返回的需要是可以序列化的 JSON 对象。
使用示例
基础用法
使用节点数据
在脚本中我们可以处理之前节点的输入输出数据,并传递给下游节点使用。
假设之前的节点标识为 node1
// 使用节点的输入数据
console.log(node1.input);
//使用节点的输出数据
console.log(node1.output);
// 使用节点的错误数据
console.log(node1.error);
// 返回数据将会作为节点输出数据,提供给后续节点使用
return 'ok';
调用 HTTP 接口
const fetch = require("node-fetch");
const apiResponse = await fetch("https://reqres.in/api/users");
const data = await apiResponse.json();
console.log(data)
return data;
在循环中使用异步方法
const fetch = require("node-fetch");
const userids = [1, 2, 3, 4];
const userdetails = [];
for (const id of userids) {
const apiResponse = await fetch(`https://reqres.in/api/users/${id}`);
const user = await apiResponse.json();
userdetails.push(user.data);
}
console.log(userdetails);
return userdetails;
云数据库
查询数据
假设我们已有一个集合 todos,其中包含以下格式记录:
[
{
"_id": "todo-identifiant-aleatoire",
"due": Date("2018-09-01"),
"style": {
"color": "white"
},
"tags": ["cloud", "database"],
"process": 20,
"done": false
},
{
"_id": "todo-identifiant-aleatoire-2",
"due": Date("2018-12-25"),
"tags": ["cloud", "database"],
"style": {
"color": "yellow"
},
"process": 50,
"done": false
}
// more...
]
获取一个记录的数据
const cloudbase = require('@cloudbase/node-sdk')
const app = cloudbase.init({
env: cloudbase.SYMBOL_CURRENT_ENV
})
// 1. 获取数据库引用
const db = app.database()
const res = await db.collection('todos')
.doc('todo-identifiant-aleatoire')
.get()
return {
res
}
获取多个记录的数据
我们也可以一次性获取多条记录。通过调用集合上的 where 方法可以指定查询条件,再调用 get 方法即可只返回满足指定查询条件的记录,例如获取所有未完成的待办事项。示例代码如下:
const cloudbase = require("@cloudbase/node-sdk");
const app = cloudbase.init({
env: cloudbase.SYMBOL_CURRENT_ENV
});
// 1. 获取数据库引用
var db = app.database();
const res = await db
.collection("todos")
.where({
done: false
})
.get();
return {
res
};
where 方法接收一个对象参数,该对象中每个字段和它的值构成一个需满足的匹配条件,各个字段间的关系是 "与" 的关系,即需同时满足这些匹配条件,在这个例子中,就是查询出 done 等于 false 的记录。
其他
其他云开发 SDK 能力,可以参考 云开发 SDK 文档