---
title: "代码执行"
---

## 介绍

通过代码节点，你可以在工作流中嵌入自定义的 Python 或 Javascript 脚本，以内置节点无法实现的方式对变量进行操作。代码节点能够简化你的工作流，适用于 Arithmetic、JSON transform、文本处理等场景。

若要在代码节点中使用其他节点的变量，需在`输入变量`中选择变量，然后在代码中进行引用。

<img
  src="https://assets-docs.dify.ai/dify-enterprise-mintlify/en/guides/workflow/node/9969aa1bc1912aebe366f5d8f5dde296.png"
  width="400"
/>

## 使用场景

通过代码节点，你可以实现结构化数据处理、数学计算和拼接数据等操作。

### 结构化数据处理

在工作流中，经常需要处理非结构化数据，如 JSON 字符串的解析、提取、转换等。最典型的例子是 HTTP 节点的数据处理：在常见的 API 返回结构中，数据可能会被嵌套在多层 JSON 对象中，而我们需要提取其中的某些字段。代码节点可以帮助你完成这些操作。

例如，你可以通过以下代码从 HTTP 节点返回的 JSON 字符串中提取 `data.name` 字段：

```python
def main(http_response: str) -> dict:
    import json
    data = json.loads(http_response)
    return {
        # 注意在输出变量中声明result
        'result': data['data']['name'] 
    }
```

### 数学计算

当工作流中需要进行复杂的数学计算时（如计算复杂的数学公式或对数据进行统计分析），也可以使用代码节点。

例如，你可以通过以下代码计算一个数组的平方差：

```python
def main(x: list) -> dict:
    return {
        # 注意在输出变量中声明result
        'result' : sum([(i - sum(x) / len(x)) ** 2 for i in x]) / len(x)
    }
```

### 拼接数据

当你需要拼接多个数据源时（如多个知识检索、数据搜索、API 调用等），代码节点可以帮助你将这些数据源整合在一起。

例如，你可以通过以下代码合并两个知识库的数据：

```python
def main(knowledge1: list, knowledge2: list) -> dict:
    return {
        # 注意在输出变量中声明result
        'result': knowledge1 + knowledge2
    }
```

## 本地部署

如果你是本地部署的用户，则需要启动沙盒服务（Sandbox），以确保恶意代码不会被执行。

启动沙盒服务需要使用 Docker。你可以直接通过 `docker-compose` 启动该服务：

```bash
docker-compose -f docker-compose.middleware.yaml up -d
```

<Note>
  如果你的系统安装的是 Docker Compose V2，请使用 `docker compose` 而非 `docker-compose`。你可以通过 `$ docker compose version` 确认版本信息。
  
  了解更多信息，请阅读 [Docker 官方文档](https://docs.docker.com/compose/#compose-v2-and-the-new-docker-compose-command)。
</Note> 

<Tip>
    你可以在 [这里](https://github.com/langgenius/dify/tree/main/docker/docker-compose.middleware.yaml) 了解沙盒服务的更多信息。
</Tip>

## 安全策略

无论是 Python3 还是 Javascript 代码执行器，它们的执行环境都被严格隔离（沙箱化）以确保安全性。这意味着你无法使用那些消耗大量系统资源或可能引发安全问题的功能，例如直接访问文件系统、进行网络请求或执行操作系统级别的命令。这些限制保证了代码的安全执行，同时避免了对系统资源的过度消耗。

### 高级功能

#### 错误重试

针对节点发生的部分异常情况，通常情况下再次重试运行节点即可解决。开启错误重试功能后，节点将在发生错误时按照预设策略进行自动重试。

你可以调整最大重试次数和每次重试间隔。

- 最大重试次数为 10 次
- 最大重试间隔时间为 5000 ms

![](https://assets-docs.dify.ai/2024/12/9fdd5525a91dc925b79b89272893becf.png)

#### 异常处理

代码节点处理信息时可能会遇到代码执行异常的情况。你可以参考以下步骤配置异常分支，以在节点出现异常时启用应对方案，从而避免中断整个流程。

1. 在代码节点启用 **异常处理**。
2. 选择异常处理方案并进行配置。

![Code Error handling](https://assets-docs.dify.ai/2024/12/58f392734ce44b22cd8c160faf28cd14.png)

<Tip>
  了解更多异常处理方法，请阅读 [异常处理](../error-handling/readme)。
</Tip>

### 常见问题

**在代码节点内填写代码后为什么无法保存？**

请检查代码是否包含危险行为。例如：

```python
def main() -> dict:
    return {
        "result": open("/etc/passwd").read(),
    }
```

这段代码包含以下问题：

- **未经授权的文件访问**：代码试图读取 `/etc/passwd` 文件，这是 Unix/Linux 系统中存储用户账户信息的关键系统文件。
- **敏感信息泄露**：`/etc/passwd` 文件包含系统用户的重要信息，如用户名、用户 ID、组 ID、home 目录路径等，直接访问可能会导致信息泄露。

危险代码将会被 Cloudflare WAF 自动拦截。你可以通过浏览器的 **网页调试工具** 中的 **网络** 查看代码是否被拦截。

![Cloudflare WAF](https://assets-docs.dify.ai/2024/12/ad4dc065c4c567c150ab7fa7bfd123a3.png)

## 代码修复

你可以通过利用上次运行的 `current_code` 和 `error_message` 变量实现自动代码修复。

当代码节点运行失败时：

- 系统会捕获代码和错误信息。
- 这些信息会作为上下文变量传递到提示中。
- 系统会生成一个新版本的代码供审查和重试。

### 修复提示

你可以自定义修复提示，例如：

```
根据以下错误信息修复代码：

代码：
{{current_code}}

错误：
{{error_message}}
```

<Info>
在提示编辑器中，使用变量插入菜单（`/`或`{`）插入变量。
</Info>

![Codefix](/images/codefix.PNG)

### 上下文变量

若要启用自动代码修复，请在提示中引用以下上下文变量：

- `current_code`：此节点上次运行的代码。
- `error_message`：若上次运行失败，则为错误消息；若上次运行成功，则为空。

当代码节点运行时，这些变量会自动可用，允许大模型使用先前的运行信息修复代码。

<Info>
    - `last_run` 变量可用于引用先前的输入/输出。  
    - 除了以上变量外，你还可以按需引用任何前置节点的输出变量。
</Info>

### 版本管理

版本管理可减少手动复制粘贴操作，让你能够在工作流中直接对代码进行迭代调试。

- 每次修复尝试都会保存为一个单独的版本（例如，版本 1、版本 2）。
- 你可以通过结果显示区域的下拉菜单在不同版本间切换。

---

{/*
Contributing Section
DO NOT edit this section!
It will be automatically generated by the script.
*/}

[编辑此页面](https://github.com/langgenius/dify-docs/edit/main/zh-hans/guides/workflow/node/code.mdx) | [提交问题](https://github.com/langgenius/dify-docs/issues/new?template=docs.yml)
