# JavaScript 指令碼

Source: https://openflow.run/zh-tw/docs/nodes/code/
Language: zh-TW
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-tw/docs/concepts/flow-state/index.md)。虛擬檔案和本機全域變數都不能作為持久化儲存。

程式碼節點支援[任務重試和錯誤處理](https://openflow.run/zh-tw/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)
