N8N中文教程
嵌入功能

配置#

功能可用性 Embed 功能需要有效的 Embed 许可证。有关何时使用 Embed、费用以及许可流程的更多信息,请参考 n8n 官网上的 Embed 页面。

认证(Authentication)#

您可以通过设置 用户管理(User management) 来保护 n8n,这是 n8n 内置的身份验证功能。 n8n 支持 LDAP 和 SAML。

凭据覆盖(Credential overwrites)#

为了向用户提供 OAuth 登录功能,可以全局性地覆盖 凭据(credentials)。这些凭据数据对用户不可见,但后端会自动使用它们。 在编辑器界面(Editor UI)中,n8n 默认隐藏所有被覆盖的字段。这意味着用户只需点击凭据上的“连接”按钮即可完成 OAuth 认证。 n8n 提供两种方式来应用凭据覆盖:通过环境变量或通过 REST API。

使用环境变量#

您可以通过设置环境变量 CREDENTIALS_OVERWRITE_DATA{ CREDENTIAL_NAME: { PARAMETER: VALUE }} 的格式来配置凭据覆盖。 警告 尽管这是可行的,但并不推荐。因为在 n8n 中环境变量并未受到保护,可能导致数据泄露给用户。

使用 REST API#

推荐的方式是通过自定义 REST 端点加载数据。将 CREDENTIALS_OVERWRITE_ENDPOINT 设置为该端点应暴露的路径。您可以设置 CREDENTIALS_OVERWRITE_ENDPOINT_AUTH_TOKEN 以要求访问此端点时提供令牌。当配置了该令牌后,只有在 Authorization 请求头中以 Bearer 令牌形式包含该令牌时,才能访问该端点。 注意 出于安全考虑,该端点只能调用一次,除非设置了 CREDENTIALS_OVERWRITE_ENDPOINT_AUTH_TOKEN。 例如:

  1. 在运行 n8n 的环境中,通过设置环境变量激活端点:
1

| ``` export CREDENTIALS_OVERWRITE_ENDPOINT=send-credentials


---|---
  2. 接着需要一个包含要覆盖凭据的 JSON 文件。例如,一个名为 `oauth-credentials.json` 的文件,用于覆盖 Asana 和 GitHub 的凭据,内容可能如下所示:

1 2 3 4 5 6 7 8 9 10

| ```
{
"asanaOAuth2Api":{
"clientId":"<id>",
"clientSecret":"<secret>"
},
"githubOAuth2Api":{
"clientId":"<id>",
"clientSecret":"<secret>"
}
}

---|--- 3. 然后使用 curl 发送该文件,将其应用到实例:

1

| ``` curl -X POST -H "Content-Type: application/json" -d @oauth-credentials.json http://localhost:5678/send-credentials --header "Authorization: Bearer "


---|---

注意
在某些情况下,凭证是基于其他凭证的。例如,`googleSheetsOAuth2Api` 继承自 `googleOAuth2Api`。在这种情况下,你可以为父级凭证(`googleOAuth2Api`)设置参数,供所有子级凭证(如 `googleSheetsOAuth2Api`)使用。

如果 `CREDENTIALS_OVERWRITE_ENDPOINT_AUTH_TOKEN` 被设置为 `secure-token`,则 curl 命令将如下所示:

1 2 3

| ```
```sh
curl -H "Content-Type: application/json" -H "Authorization: Bearer secure-token" --data @oauth-credentials.json http://localhost:5678/send-credentials

---|---
## 环境变量#
n8n 提供了许多可配置的 环境变量。以下是针对你托管解决方案最相关的环境变量:

变量 | 类型 | 默认值 | 说明
---|---|---|---
`EXECUTIONS_TIMEOUT` | 数字(Number) | `-1` | 设置所有工作流的默认超时时间(单位:秒),超过该时间后 n8n 将停止其执行。用户可以在单个工作流中覆盖此设置,但最长不能超过 `EXECUTIONS_TIMEOUT_MAX` 中设定的时间。将 `EXECUTIONS_TIMEOUT` 设为 `-1` 可禁用超时。
`EXECUTIONS_DATA_PRUNE` | 布尔值(Boolean) | `true` | 是否基于滚动周期自动删除过去执行记录的数据。
`EXECUTIONS_DATA_MAX_AGE` | 数字(Number) | `336` | 执行记录在达到指定小时数后会被删除。
`EXECUTIONS_DATA_PRUNE_MAX_COUNT` | 数字(Number) | `10000` | 数据库中保留的最大执行记录数量。设为 `0` 表示无限制。
`NODES_EXCLUDE` | 字符串数组(Array of strings) | - | 指定不加载哪些节点。例如,若用户不可信,可通过此选项屏蔽存在安全风险的节点:`NODES_EXCLUDE: "[\"n8n-nodes-base.executeCommand\", \"n8n-nodes-base.readWriteFile\"]"`
`NODES_INCLUDE` | 字符串数组(Array of strings) | - | 指定仅加载哪些节点。
`N8N_TEMPLATES_ENABLED` | 布尔值(Boolean) | `true` | 启用(true)或禁用(false)工作流模板功能。
`N8N_TEMPLATES_HOST` | 字符串(String) | `https://api.n8n.io` | 若你构建自己的工作流模板库,请修改此项。注意:你的 API 必须提供与 n8n 相同的接口端点和响应结构。更多信息请参考 工作流模板。

## 后端钩子(Backend hooks)#
你可以定义外部钩子(hooks),当 n8n 执行特定操作时会触发这些钩子。你可以利用它们来记录数据、修改数据,或通过抛出错误来阻止某个操作。

### 可用钩子#

钩子 | 参数 | 说明
---|---|---
`credentials.create` | `[credentialData: ICredentialsDb]` | 在创建新凭据之前调用。可用于限制凭据数量。
`credentials.delete` | `[id: credentialId]` | 在删除凭据之前调用。
`credentials.update` | `[credentialData: ICredentialsDb]` | 在保存已有凭据之前调用。
`frontend.settings` | `[frontendSettings: IN8nUISettings]` | n8n 启动时调用。可用于覆盖前端数据,例如显示的 OAuth URL。
`n8n.ready` | `[app: App]` | 当 n8n 准备就绪后调用。可用于注册自定义 API 接口等操作。
`n8n.stop` |  | 当 n8n 进程停止时调用。可用于保存一些进程状态数据。
`oauth1.authenticate` | `[oAuthOptions: clientOAuth1.Options, oauthRequestData: {oauth_callback: string}]` | 在进行 OAuth1 认证前调用。可用于覆盖 OAuth 回调地址(callback URL)。
`oauth2.callback` | `[oAuth2Parameters: {clientId: string, clientSecret: string \| undefined, accessTokenUri: string, authorizationUri: string, redirectUri: string, scopes: string[]}]` | 在 OAuth2 回调过程中调用。可用于覆盖 OAuth 回调地址。
`workflow.activate` | `[workflowData: IWorkflowDb]` | 在激活工作流之前调用。可用于限制激活的工作流数量。
`workflow.afterDelete` | `[workflowId: string]` | 在工作流被删除之后调用。
`workflow.afterUpdate` | `[workflowData: IWorkflowBase]` | 在已有工作流保存之后调用。
`workflow.create` | `[workflowData: IWorkflowBase]` | 在创建工作流之前调用。可用于限制已保存工作流的数量。
`workflow.delete` | `[workflowId: string]` | 在删除工作流之前调用。
`workflow.postExecute` | `[run: IRun, workflowData: IWorkflowBase]` | 在工作流执行完成后调用。
`workflow.preExecute` | `[workflow: Workflow, mode: WorkflowExecuteMode]` | 在工作流执行前调用。可用于统计或限制工作流执行次数。
`workflow.update` | `[workflowData: IWorkflowBase]` | 在保存已有工作流之前调用。

### 注册钩子#
通过设置包含钩子函数的文件来注册钩子。要注册钩子,请设置环境变量 `EXTERNAL_HOOK_FILES`。

你可以将其指向单个文件:
`EXTERNAL_HOOK_FILES=/data/hook.js`

也可以指定多个以分号分隔的文件:
`EXTERNAL_HOOK_FILES=/data/hook1.js;/data/hook2.js`

### 后端钩子文件#
钩子文件是普通的 JavaScript 文件,格式如下所示:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

| ```
module.exports={
"frontend":{
"settings":[
asyncfunction(settings){
settings.oauthCallbackUrls.oauth1='https://n8n.example.com/oauth1/callback';
settings.oauthCallbackUrls.oauth2='https://n8n.example.com/oauth2/callback';
}
]
},
"workflow":{
"activate":[
asyncfunction(workflowData){
constactiveWorkflows=awaitthis.dbCollections.Workflow.count({active:true});
if(activeWorkflows > 1){
throw new Error(
'Active workflow limit reached.'
);
}
}
]
}
}

---|---
### 后端钩子函数#
一个钩子(hook)或钩子文件可以包含多个钩子函数,这些函数会依次执行。
如果钩子函数的参数是对象,则可以通过修改该参数的数据来改变 n8n 的行为。
你还可以在任意钩子函数中通过 `this.dbCollections` 访问数据库(参见 后端钩子文件 中的代码示例)。

## 前端外部钩子#
与后端外部钩子类似,你也可以在前端代码中定义外部钩子,当用户执行特定操作时,n8n 会触发这些钩子。例如,你可以使用它们来记录数据或修改数据。

### 可用钩子#
Hook | 说明
---|---
`credentialsEdit.credentialTypeChanged` | 当现有凭据的类型发生变化时调用。
`credentials.create` | 当用户创建新凭据时调用。
`credentialsList.dialogVisibleChanged` |
`dataDisplay.nodeTypeChanged` |
`dataDisplay.onDocumentationUrlClick` | 当用户点击帮助文档链接时调用。
`execution.open` | 当打开一个已有执行记录时调用。
`executionsList.openDialog` | 当用户从现有的工作流执行列表中选择某条执行时调用。
`expressionEdit.itemSelected` |
`expressionEdit.dialogVisibleChanged` |
`nodeCreateList.filteredNodeTypesComputed` |
`nodeCreateList.nodeFilterChanged` | 当用户对节点面板过滤器进行任何更改时调用。
`nodeCreateList.selectedTypeChanged` |
`nodeCreateList.mounted` |
`nodeCreateList.destroyed` |
`nodeSettings.credentialSelected` |
`nodeSettings.valueChanged` |
`nodeView.createNodeActiveChanged` |
`nodeView.addNodeButton` |
`nodeView.createNodeActiveChanged` |
`nodeView.mount` |
`pushConnection.executionFinished` |
`showMessage.showError` |
`runData.displayModeChanged` |
`workflow.activeChange` |
`workflow.activeChangeCurrent` |
`workflow.afterUpdate` | 当用户更新现有工作流时调用。
`workflow.open` |
`workflowRun.runError` |
`workflowRun.runWorkflow` | 当工作流执行时调用。
`workflowSettings.dialogVisibleChanged` |
`workflowSettings.saveSettings` | 当用户保存工作流设置时调用。

### 注册钩子#
你可以通过在页面上加载钩子脚本来注册钩子。一种实现方式是在项目中创建一个钩子文件,并在 `editor-ui/public/index.html` 文件中添加 script 标签:

1

| ```
<script src="frontend-hooks.js"></script>

---|---
### 前端钩子文件#
前端外部钩子文件是普通的 JavaScript 文件,其格式如下所示:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

| ```
window.n8nExternalHooks = {
  nodeView: {
    mount: [
      function(store, meta) {
        // 执行某些操作
      },
    ],
    createNodeActiveChanged: [
      function(store, meta) {
        // 执行某些操作
      },
      function(store, meta) {
        // 执行其他操作
      },
    ],
    addNodeButton: [
      function(store, meta) {
        // 执行某些操作
      },
    ],
  },
};

---|---

前端钩子函数#

你可以为每个钩子定义多个钩子函数。每个钩子函数会被传入以下参数:

  • store:Vuex store 对象。你可以使用它来更改或获取 store 中的数据。
  • metadata:包含钩子提供的所有数据的对象。要查看具体传递的内容,可以在 editor-ui 包中搜索对应的钩子名称。