# JavaScript 脚本

Source: https://openflow.run/zh-cn/docs/nodes/code/
Language: zh-CN
Product version: 0.1.0-beta.77

在隔离环境中用 JavaScript 模块处理输入，并明确声明输出。

JavaScript 脚本节点（接口类型为 `code`）适合数据转换、计算，以及组合受支持的能力调用。如果只需要发起一个 HTTP 请求，不涉及数据转换，HTTP 请求节点通常配置更少。

## 模块与端口

代码是一个 ES 模块，默认导出函数接收 `(inputs, context)`，返回业务输出或解析为业务输出的 Promise。

```javascript
export default ({ name, prefix }) => ({
  message: `${prefix}, ${name}!`
});
```

通过 `config.outputs` 声明自定义输出 schema。具名输入可直接绑定，也可以在 `config.inputs` 中添加约束。模块 ID 和运行时组装由公开接口负责。

```json
{
  "op": "node.add", "as": "greet", "type": "code", "name": "Compose greeting",
  "code": "export default ({name, prefix}) => ({message: `${prefix}, ${name}!`});",
  "config": { "outputs": { "message": { "schema": { "type": "string" }, "nullable": false } } },
  "inputs": {
    "name": { "kind": "value", "value": "Ada" },
    "prefix": { "kind": "value", "value": "Hello" }
  }
}
```

开始节点提供姓名，固定值节点提供前缀，代码节点组合两者，工作流输出节点声明最终结果。

**输入**
{"name":"Ada"}

**预期结果**
{"message":"Hello, Ada!"}

**运行前准备**
导入或执行此案例需要 Open Flow 服务；预览本身可离线使用。

[下载工作流](https://openflow.run/docs/examples/first-workflow.openflow.json)

## 运行时限制

受支持的 Node 内置模块只是兼容子集。每次任务都会获得从 `/tmp` 开始的全新内存文件系统，既不能访问宿主机磁盘，也不会延续到下次调用。不支持任意安装的包、动态导入和 CommonJS `require`。

调用应用操作、工作流或 HTTP 主机时，需要明确声明代码能力。`context.fetch` 受已声明主机和部署端当前引擎契约限制，不会继承平台凭据，也不提供任意网络访问。

## 持久化结果与失败

业务输出应返回 JSON。运行所属的二进制内容使用受支持的 Artifact 接口，跨运行业务值则明确写入[工作流状态](https://openflow.run/zh-cn/docs/concepts/flow-state/index.md)。虚拟文件和本地全局变量都不能作为持久化存储。

代码节点支持[任务重试和错误处理](https://openflow.run/zh-cn/docs/concepts/errors-and-retries/index.md)。重试会重新执行整个模块，可能重复外部操作。资源限制、取消和结果不确定等情况仍按运行时契约处理。

## 资料来源

*   [docs/authoring/node-authoring.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/authoring/node-authoring.md)
*   [docs/control/contracts/nodejs-runtime.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/control/contracts/nodejs-runtime.md)
*   [docs/control/contracts/control-api.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/control/contracts/control-api.md#10-code-action-contract)
*   [packages/open-flow/src/workbench/browser/runtime/editor/addNodeOptions.ts](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/packages/open-flow/src/workbench/browser/runtime/editor/addNodeOptions.ts)
