解锁n8n:开启工作流自动化的无限可能(5/6)
文章摘要:n8n 是一款开源低代码工作流自动化平台,通过可视化拖放节点创建复杂工作流,无需大量代码。具有强大集成能力、数据转换、错误处理等功能,适用于数据同步、客户关系管理、IT 自动化等场景。相比 Zapier、IFTTT 等工具,n8n 开源免费且扩展性强,支持自定义节点和容器化部署。未来有望加强与人工智能等技术融合,提升用户体验和数据安全防护。
目录
引言
一、n8n 是什么
二、n8n 的主要功能
2.1 工作流自动化
2.2 丰富的集成能力
2.3 触发器和动作
2.4 数据转换
2.5 错误处理
2.6 调试和日志记录
三、n8n 的技术原理
3.1 节点和连接
3.2 事件驱动
3.3 数据流
3.4 并行和顺序执行
3.5 容器化
3.6 Webhook 和 REST API
四、n8n 的应用场景
4.1 数据同步
4.2 客户关系管理
4.3 IT 自动化
五、n8n 与其他类似工具对比
5.1 工具对比
5.2 代码案例
六、如何使用 n8n
6.1 安装 n8n
6.2 创建工作流
6.3 调试与优化
七、总结与展望
引言
在数字化时代的浪潮下,工作流自动化已成为提升效率、降低成本的关键手段,它能够将企业从繁琐的重复性任务中解放出来,专注于更具创造性和战略性的工作 。想象一下,每天花费大量时间在手动数据录入、文件传输和任务提醒这些机械性操作上,不仅效率低下,还容易出错。而工作流自动化工具的出现,就像是为我们的工作流程按下了 “快进键”,让这些繁琐的任务能够自动执行,大大提高了工作效率。
在众多工作流自动化工具中,n8n 以其独特的优势脱颖而出,成为了许多企业和开发者的首选。它不仅功能强大,而且易于使用,能够帮助我们轻松实现各种复杂的工作流自动化任务。接下来,就让我们一起深入了解 n8n 这款神奇的工具吧!
一、n8n 是什么
n8n 是一款开源且功能强大的低代码工作流自动化平台,它允许用户通过可视化界面,以拖放节点的方式轻松创建复杂的自动化工作流 ,而无需编写大量代码。其名称中的 “n” 代表着 “无数”,寓意着它能够连接无数的应用和服务,实现各种各样的自动化任务。n8n官网地址:https://n8n.io/
n8n 的核心在于其独特的节点(Node)概念。每个节点都代表了一个特定的操作或功能,比如发送邮件、读取数据库数据、调用 API 等等 。用户只需要将这些节点按照业务逻辑连接起来,就可以构建出复杂的工作流。例如,你可以创建一个工作流,当在 GitHub 上有新的代码提交时,自动触发测试流程,测试通过后发送通知邮件给团队成员 。这种可视化的操作方式,大大降低了工作流自动化的门槛,让非技术人员也能轻松上手。n8n官方开源地址:https://github.com/n8n-io/n8n
此外,n8n 拥有极其丰富的集成能力,支持超过 500 种应用程序和服务的集成 ,涵盖了从社交媒体平台(如 Facebook、Twitter )、办公软件(如 Microsoft Excel、Google Sheets )、云存储(如 Dropbox、Google Drive )到企业级应用(如 Salesforce、SAP )等各个领域。这使得它能够轻松打破不同系统之间的数据孤岛,实现数据的无缝流转和业务流程的自动化。
二、n8n 的主要功能
2.1 工作流自动化
n8n 的工作流自动化功能十分强大,能够帮助用户轻松创建复杂的自动化流程。以一个简单的社交媒体发布工作流为例,当你在 WordPress 上发布新文章时,希望自动将文章分享到 Twitter 和 Facebook ,以扩大内容的传播范围。在 n8n 中,你只需创建一个工作流,添加 WordPress 触发器节点,设置为当有新文章发布时触发 ;然后连接 Twitter 和 Facebook 的发布节点,配置好相应的认证信息和发布内容格式,即可实现这一自动化任务 。这样,每次发布新文章时,无需手动操作,n8n 会自动将文章分享到指定的社交媒体平台。
再比如,一个电商企业的订单处理工作流。当有新订单产生时,n8n 可以自动从订单系统中获取订单信息,检查库存是否充足。如果库存充足,自动更新库存数量,并将订单信息发送到物流系统安排发货;如果库存不足,自动发送通知给采购部门补货,并给客户发送库存不足的通知邮件 。这个工作流涉及多个系统和复杂的条件判断,通过 n8n 的可视化界面,用户可以轻松将各个节点连接起来,实现订单处理的全自动化。
2.2 丰富的集成能力
n8n 支持集成的应用和服务超过 500 种,这使得它能够满足各种不同的业务需求 。在办公领域,它可以与 Microsoft Excel、Google Sheets 集成,实现数据的自动同步和处理。例如,将 Google Sheets 中的销售数据自动同步到企业的 CRM 系统中,以便销售人员随时查看和跟进 。在社交媒体方面,除了前面提到的 Twitter 和 Facebook ,它还支持与 Instagram、LinkedIn 等平台集成,帮助企业实现社交媒体的统一管理和运营。
在云存储领域,n8n 与 Dropbox、Google Drive 、OneDrive 等集成,方便用户进行文件的自动备份和同步。比如,当你在本地完成一份重要文档的编辑后,n8n 可以自动将其备份到 Google Drive ,确保数据的安全性和可访问性。此外,对于企业级应用,n8n 能够与 Salesforce、SAP 等深度集成,实现业务流程的自动化和数据的无缝流转。例如,在 Salesforce 中创建新客户时,自动在 SAP 系统中创建相应的客户档案和销售订单 。
2.3 触发器和动作
触发器是工作流的启动条件,它可以基于各种事件来触发工作流的执行 。常见的触发器包括定时触发器、Webhook 触发器和事件触发器等。定时触发器允许用户设置工作流在特定的时间间隔或时间点执行,比如每天凌晨 2 点自动执行数据备份任务 。Webhook 触发器则是当接收到来自外部系统的 HTTP 请求时触发工作流,例如,当 GitHub 上有新的代码提交时,通过 Webhook 通知 n8n 触发自动化测试流程 。事件触发器则是基于特定应用或服务内部的事件来触发,如邮件客户端收到新邮件时触发工作流。
动作是工作流中执行的具体操作,每个动作节点都对应着一个特定的功能 。例如,发送邮件动作节点可以用于发送通知邮件,读取文件动作节点可以从指定位置读取文件内容,调用 API 动作节点可以向外部 API 发送请求并获取响应数据 。当触发器被触发后,与之关联的动作节点会按照工作流的设计顺序依次执行,从而实现自动化任务的完成。
2.4 数据转换
在工作流运行过程中,数据往往需要进行各种处理和转换,以满足不同节点和服务的需求 。n8n 提供了丰富的数据转换功能,用户可以使用内置的表达式和函数对数据进行筛选、合并、格式化等操作 。例如,在一个从数据库中读取数据并发送邮件通知的工作流中,可能需要对读取到的数据进行筛选,只选择符合特定条件的数据发送邮件 。n8n 的筛选功能可以通过设置条件表达式来实现,如选择销售额大于 10000 的数据记录 。
数据合并也是常见的需求,比如将来自多个数据源的数据合并成一个数据集进行分析。在 n8n 中,可以使用合并节点将不同节点输出的数据按照指定的规则进行合并 。此外,对于数据格式的转换,n8n 同样得心应手。例如,将日期格式从 “YYYY-MM-DD” 转换为 “MM/DD/YYYY”,或者将文本数据转换为 JSON 格式等 。这些数据转换功能确保了数据在工作流中的准确和顺畅流动。
2.5 错误处理
n8n 拥有完善的错误处理机制,这对于保证工作流的稳定运行至关重要 。当工作流执行过程中出现错误时,n8n 会捕获错误信息,并根据用户预设的规则进行处理 。其中,重试机制是一种常见的处理方式,当某个节点执行失败时,n8n 可以自动重试一定次数,以应对可能的临时性错误,如网络波动导致的 API 调用失败 。如果重试多次后仍然失败,n8n 可以发送错误通知给相关人员,通知方式可以是邮件、短信或者即时通讯工具,确保问题能够及时被发现和解决 。
此外,n8n 还支持跳过当前出错步骤继续执行后续流程的功能 。这在一些情况下非常有用,比如在处理一批数据时,如果某条数据处理出错,但不希望影响其他数据的处理,可以选择跳过该条数据,继续处理下一条,保证整个工作流的连续性 。通过这些灵活的错误处理机制,n8n 大大提高了工作流的可靠性和稳定性。
2.6 调试和日志记录
在工作流开发过程中,调试工具是必不可少的,n8n 提供了强大的调试功能,帮助用户快速定位和解决问题 。用户可以在工作流设计界面中,使用调试按钮启动调试模式 。在调试模式下,工作流会以单步执行的方式运行,用户可以查看每个节点的输入和输出数据,以及节点执行的详细信息,从而判断问题出在哪里 。例如,如果某个节点没有输出预期的数据,可以在调试模式下查看该节点的输入数据是否正确,以及节点的配置是否有误 。
同时,n8n 的日志记录功能也非常详细,它会记录工作流的每一次运行信息,包括执行时间、触发事件、节点执行结果、错误信息等 。这些日志信息可以在日志管理界面中查看,用户可以通过分析日志来监控工作流的运行状态,了解工作流的执行历史,以及排查潜在的问题 。对于一些复杂的工作流,通过查看日志可以清晰地了解数据的流向和处理过程,为优化工作流提供重要依据 。
三、n8n 的技术原理
3.1 节点和连接
在 n8n 中,节点是工作流构建的基本单元,每个节点都代表着一个特定的操作或数据点 。比如,HTTP Request 节点可以用于向指定的 API 发送请求,获取数据;Google Sheets 节点能够对 Google 表格中的数据进行读取、写入和修改等操作 。这些节点就像是一个个功能模块,各自具备独特的功能,等待用户根据业务需求进行组合。
当我们创建一个工作流时,通过连接线将不同的节点串联起来,就像搭建一条生产流水线一样 。连接线不仅明确了节点之间的执行顺序,还承担着数据传递的重要职责 。例如,在一个数据处理工作流中,我们可以使用 HTTP Request 节点从某个 API 获取数据,然后通过连接线将这些数据传递给 JSON Parse 节点进行解析,解析后的结果再传递给后续的节点进行进一步处理 。这样,通过节点和连接线的有机组合,就形成了完整的工作流逻辑,实现了复杂业务流程的自动化处理。
3.2 事件驱动
n8n 的工作流执行是基于事件驱动的原理,这意味着工作流不是随时都在运行,而是由特定的事件触发启动 。常见的触发事件包括接收到 HTTP 请求、达到设定的定时时间、外部系统通过 API 调用触发等 。以 HTTP Request 触发器节点为例,当 n8n 接收到来自外部系统发送到指定 URL 的 HTTP 请求时,与之关联的工作流就会被触发执行 。假设我们有一个电商订单处理的工作流,当新订单产生时,电商系统会向 n8n 发送一个 HTTP 请求,n8n 接收到这个请求后,立即触发订单处理工作流,开始执行后续的操作,如获取订单信息、检查库存、安排发货等 。
再比如定时任务触发器,我们可以设置一个工作流每天凌晨 3 点自动执行数据备份任务 。到了设定的时间,定时任务触发器会触发工作流,工作流中的各个节点开始依次执行,将需要备份的数据进行整理和存储,确保数据的安全性和完整性 。这种事件驱动的机制,使得 n8n 能够根据实际业务需求实时响应,提高了自动化流程的灵活性和实用性,避免了资源的浪费 。
3.3 数据流
数据流是 n8n 工作流运行的核心机制,它描述了数据在节点之间的流动和处理过程 。当一个节点接收到输入数据后,会根据自身的功能对数据进行相应的处理,然后将处理结果作为输出传递给下一个节点 。例如,在一个数据分析工作流中,CSV File 节点读取 CSV 文件中的数据,这些数据作为输入传递给 Filter 节点 。Filter 节点根据用户设定的条件对数据进行筛选,只保留符合条件的数据记录,然后将筛选后的结果传递给 Chart 节点 。Chart 节点再根据接收到的数据生成可视化的图表,最终输出给用户查看 。
这种数据流驱动的方式,使得工作流能够根据不同的输入数据动态生成相应的输出,实现多样化的业务逻辑 。而且,n8n 提供了丰富的数据处理和转换功能,用户可以在节点之间对数据进行各种操作,如筛选、合并、格式化、计算等 。这使得数据在流动过程中能够不断被加工和优化,以满足不同业务场景的需求 。比如,在一个营销活动数据分析工作流中,我们可以对从不同渠道收集到的数据进行清洗和合并,然后计算各种营销指标,如转化率、点击率等,最后将分析结果生成报表,为营销决策提供有力支持 。
3.4 并行和顺序执行
n8n 的工作流设计非常灵活,支持并行和顺序执行两种方式,以适应不同的业务逻辑需求 。对于一些相互独立、不依赖于其他节点执行结果的节点,可以设置为并行执行 。例如,在一个内容发布工作流中,我们需要将一篇文章同时发布到多个社交媒体平台,如微信公众号、微博、抖音 。这三个发布节点之间相互独立,没有先后顺序的依赖关系,我们可以将它们设置为并行执行 。这样,n8n 会同时向这三个平台发送发布请求,大大提高了工作流的执行效率,缩短了整体运行时间 。
而对于存在先后依赖关系的节点,则需要按照顺序依次执行 。比如在一个文件处理工作流中,首先需要使用 File Read 节点读取文件内容,然后将读取到的内容传递给 Text Processing 节点进行文本处理,最后将处理后的结果传递给 File Write 节点写入到新的文件中 。这三个节点之间存在明显的先后顺序,必须按照顺序依次执行,才能确保数据处理的准确性和逻辑性 。通过灵活运用并行和顺序执行,n8n 能够高效地处理各种复杂的业务流程,满足不同用户的需求 。
3.5 容器化
n8n 支持基于 Docker 的容器化部署,这为其带来了诸多显著的优势 。首先,容器化部署保证了环境的一致性 。无论在开发、测试还是生产环境中,n8n 都能在相同的容器化环境中运行,避免了因环境差异导致的问题 。例如,开发人员在本地开发环境中使用 Docker 容器部署 n8n,测试人员可以直接使用相同的容器镜像在测试环境中进行测试,确保了测试结果的准确性和可重复性 。在生产环境中,也可以使用相同的容器镜像进行部署,减少了因环境配置不一致而引发的故障风险 。
其次,容器的可移植性使得 n8n 能够轻松部署到不同的服务器或云平台上 。用户可以根据自身需求,将 n8n 容器部署到物理服务器、虚拟机或者各种云服务提供商(如 AWS、Azure、Google Cloud )的云服务器上 。这种灵活性方便了用户进行灵活的资源配置和扩展 。比如,当业务量增长时,用户可以轻松地将 n8n 容器部署到更多的服务器上,实现水平扩展,提高系统的处理能力 。同时,容器化部署还简化了 n8n 的安装和升级过程,用户只需要拉取最新的容器镜像并重新启动容器,就可以完成 n8n 的升级,大大降低了运维成本 。
3.6 Webhook 和 REST API
为了方便与外部系统进行交互,n8n 提供了 Webhook 和 REST API 支持 。Webhook 是一种实时的 HTTP 回调机制,通过 Webhook,外部系统可以在特定事件发生时向 n8n 发送通知,触发相应的工作流执行 。例如,当 GitHub 上有新的代码提交时,GitHub 可以通过 Webhook 向 n8n 发送一个包含提交信息的 HTTP 请求,n8n 接收到这个请求后,触发与之关联的自动化测试工作流,自动对新提交的代码进行测试 。这种方式实现了不同系统之间的实时通信和协作,使得 n8n 能够及时响应外部事件,实现业务流程的自动化 。
REST API 则允许外部系统与 n8n 进行更深入的交互 。外部系统可以通过 REST API 查询 n8n 工作流的状态、获取执行结果,甚至创建和修改工作流 。比如,一个企业的内部管理系统可以通过 REST API 获取 n8n 中某个工作流的执行结果,并将这些结果展示在管理系统的界面上,方便管理人员查看 。开发人员也可以使用 REST API 编写脚本,自动创建和修改 n8n 的工作流,实现更高级的自动化操作 。通过 Webhook 和 REST API,n8n 实现了与其他系统之间的深度集成和双向通信,进一步拓展了其应用场景和功能 。
四、n8n 的应用场景
4.1 数据同步
在当今数字化的工作环境中,数据往往存储在多个不同的系统和平台中,实现这些数据的同步是许多企业面临的挑战 。n8n 凭借其强大的自动化能力,能够轻松实现数据库与云存储之间的数据同步 。
以 MySQL 数据库与 Google Drive 云存储为例,假设一家企业的业务数据存储在 MySQL 数据库中,为了确保数据的安全性和可访问性,需要定期将数据库中的数据备份到 Google Drive 。使用 n8n,我们可以创建一个自动化工作流来实现这一目标 。首先,添加 MySQL 触发器节点,设置定时触发条件,比如每天凌晨 1 点触发 。当触发条件满足时,MySQL 节点从数据库中读取需要备份的数据 。然后,将这些数据传递给 Google Drive 的文件创建节点,在 Google Drive 中创建一个新的文件,并将从 MySQL 读取的数据写入该文件 。这样,每天凌晨 1 点,n8n 都会自动执行这个工作流,将 MySQL 数据库中的数据备份到 Google Drive ,实现了数据的定期同步和备份 。
在这个过程中,n8n 不仅能够按照预定的时间进行数据同步,还能对数据进行处理和转换 。例如,如果数据库中的数据格式不符合 Google Drive 存储的要求,n8n 可以在数据传输过程中,使用数据转换节点对数据进行格式化处理,确保数据能够准确无误地存储到 Google Drive 中 。通过这种方式,n8n 大大提高了数据同步的效率和准确性,减少了人工干预,降低了出错的风险 。
4.2 客户关系管理
在客户关系管理(CRM)中,n8n 可以发挥重要作用,帮助企业自动化处理客户信息、跟进和反馈等流程,提升客户服务质量和工作效率 。
当企业通过各种渠道(如网站表单、电子邮件、社交媒体 )收集到客户信息时,n8n 可以自动将这些信息整合到 CRM 系统中 。例如,当客户在企业网站上填写联系表单后,表单数据会通过 Webhook 发送到 n8n 。n8n 接收到数据后,使用 CRM 集成节点(如 Salesforce 节点)将客户信息自动录入到 CRM 系统中,并根据客户的来源和填写的信息,自动为客户打上相应的标签 。这样,销售人员可以在 CRM 系统中快速查看和管理新客户信息,无需手动录入,节省了大量时间和精力 。
在客户跟进方面,n8n 可以根据预设的规则自动发送跟进邮件或短信 。比如,当客户与企业进行初次沟通后的 3 天内,如果没有进一步的互动,n8n 会自动触发发送一封跟进邮件,询问客户是否还有疑问或需要进一步的帮助 。邮件内容可以根据客户之前的沟通记录和需求进行个性化定制 。同时,n8n 还可以监控客户对跟进邮件的回复情况,如果客户回复了邮件,n8n 可以自动将回复内容同步到 CRM 系统中,并提醒销售人员及时处理 。
对于客户反馈,n8n 同样能够实现自动化处理 。当客户通过邮件或在线客服提交反馈后,n8n 可以自动将反馈信息提取出来,并根据反馈的类型和紧急程度,将其分配给相应的客服人员 。客服人员处理完反馈后,n8n 可以自动发送满意度调查邮件给客户,收集客户对处理结果的评价 。通过这些自动化流程,n8n 能够有效提升客户关系管理的效率和质量,增强客户满意度和忠诚度 。
4.3 IT 自动化
在 IT 领域,n8n 在服务器管理、任务调度等场景中有着广泛的应用,能够帮助 IT 团队实现自动化运维,提高系统的稳定性和可靠性 。
在服务器管理方面,假设企业有多个服务器,需要定期检查服务器的运行状态,如 CPU 使用率、内存使用率、磁盘空间等 。使用 n8n,我们可以创建一个工作流,添加定时触发器,设置为每小时触发一次 。当触发条件满足时,n8n 通过 SSH 节点连接到各个服务器,执行相应的命令获取服务器的运行状态信息 。然后,将这些信息传递给数据分析节点,对数据进行分析和处理 。如果发现某个服务器的 CPU 使用率超过 80%,n8n 可以自动发送警报邮件或短信给 IT 管理员,通知其及时处理 。同时,n8n 还可以将服务器的运行状态数据存储到数据库中,方便后续的查询和分析 。
在任务调度方面,n8n 可以帮助 IT 团队自动化执行各种重复性的任务 。例如,每天凌晨 3 点需要在服务器上执行一次数据备份任务,然后将备份文件传输到远程存储服务器 。使用 n8n,我们可以创建一个工作流,添加定时触发器设置为凌晨 3 点触发 。工作流触发后,首先通过 SSH 节点在服务器上执行数据备份命令,生成备份文件 。接着,使用文件传输节点(如 SFTP 节点)将备份文件传输到远程存储服务器 。如果传输过程中出现错误,n8n 可以自动重试一定次数,并在重试失败后发送错误通知给 IT 管理员 。通过这样的自动化任务调度,n8n 大大减轻了 IT 团队的工作负担,提高了任务执行的准确性和可靠性 。
五、n8n 与其他类似工具对比
5.1 工具对比
在工作流自动化领域,除了 n8n,还有一些其他备受关注的工具,如 Zapier、IFTTT 等 。下面从功能、价格、易用性、扩展性等方面,对 n8n 与这些类似工具进行对比,以便大家更清晰地了解 n8n 的优势。
从功能层面来看,Zapier 是一款知名的自动化工具,集成能力出色,支持连接数千种应用 。它在数据传输方面表现优秀,能够快速地在不同应用之间传递数据 。IFTTT 则以简单的 “如果这样,那么那样” 逻辑为核心,适合创建简单的自动化任务 。而 n8n 的功能十分全面,不仅拥有丰富的集成选项,支持超过 500 种应用和服务的集成,还具备强大的数据处理和复杂逻辑编排能力 。例如,在处理数据时,n8n 可以使用内置的表达式和函数对数据进行筛选、合并、格式化等操作 ,而 Zapier 和 IFTTT 在这方面的功能相对较弱 。在工作流设计上,n8n 的节点和连接方式更加灵活,能够构建出非常复杂的工作流,满足各种复杂业务场景的需求 。
价格方面,Zapier 的免费版每月仅提供 100 次任务执行,若要升级,最低价格为每月 20 美元,含 750 次任务 ,对于需要处理大量任务的用户来说,成本较高 。IFTTT 的免费用户只能保存 3 个自动化(Applets) ,含有 AI 功能的升级方案则需要每月 5 美元 。相比之下,n8n 最大的优势在于它是开源的,用户可以自行搭建和部署,无需支付额外的软件使用费用 。虽然 n8n 也提供官方托管服务,但如果用户具备一定的技术能力,使用自托管方式可以大大降低成本 ,这对于个人开发者和预算有限的小型企业来说,具有很大的吸引力 。
在易用性上,Zapier 拥有简洁的用户界面和直观的操作流程,新手用户能够快速上手 。IFTTT 的操作也较为简单,通过简单的条件设置即可创建自动化任务 。n8n 同样提供了可视化的界面,以拖放节点的方式创建工作流,对于有一定技术基础的用户来说,上手难度不大 。而且,n8n 还提供了丰富的模板和活跃的社区支持,用户可以参考社区中的模板和经验分享,快速创建自己的工作流 。此外,n8n 的文档也非常详细,对于用户在使用过程中遇到的问题,能够提供及时的帮助和指导 。
扩展性上,Zapier 主要依赖于其内置的集成接口,用户可以使用这些接口连接各种应用,但对于一些特殊需求,可能需要编写自定义代码来实现 。IFTTT 的扩展性相对有限,主要侧重于简单的自动化场景 。n8n 则具有很强的扩展性,它支持用户创建自定义节点 。这意味着如果用户有特殊的应用或服务需要集成,或者需要实现特定的功能,可以通过编写自定义节点来满足需求 。同时,n8n 基于 Docker 的容器化部署方式,也方便用户进行扩展和升级,能够轻松部署到不同的服务器或云平台上 ,适应不同的业务规模和发展需求 。
综上所述,n8n 在功能、价格、易用性和扩展性等方面都展现出了独特的优势 。尤其是对于那些追求开源、低成本、高度自定义和强大功能的用户来说,n8n 无疑是一个非常理想的选择 。
5.2 代码案例
(1)n8n/jest.config.js
const { pathsToModuleNameMapper } = require('ts-jest');
const { compilerOptions } = require('get-tsconfig').getTsconfig().config;
/** @type {import('ts-jest').TsJestGlobalOptions} */
const tsJestOptions = {
isolatedModules: true,
tsconfig: {
...compilerOptions,
declaration: false,
sourceMap: true,
},
};
const isCoverageEnabled = process.env.COVERAGE_ENABLED === 'true';
const esmDependencies = [
'pdfjs-dist',
'openid-client',
'oauth4webapi',
'jose',
// Add other ESM dependencies that need to be transformed here
];
const esmDependenciesPattern = esmDependencies.join('|');
const esmDependenciesRegex = `node_modules/(${esmDependenciesPattern})/.+.m?js$`;
/** @type {import('jest').Config} */
const config = {
verbose: true,
testEnvironment: 'node',
testRegex: '.(test|spec).(js|ts)$',
testPathIgnorePatterns: ['/dist/', '/node_modules/'],
transform: {
'^.+.ts$': ['ts-jest', tsJestOptions],
[esmDependenciesRegex]: [
'babel-jest',
{
presets: ['@babel/preset-env'],
plugins: ['babel-plugin-transform-import-meta'],
},
],
},
transformIgnorePatterns: [`/node_modules/(?!${esmDependenciesPattern})/`],
// This resolve the path mappings from the tsconfig relative to each jest.config.js
moduleNameMapper: compilerOptions?.paths
? pathsToModuleNameMapper(compilerOptions.paths, {
prefix: `${compilerOptions.baseUrl ? `/${compilerOptions.baseUrl.replace(/^.//, '')}` : ''}`,
})
: {},
setupFilesAfterEnv: ['jest-expect-message'],
collectCoverage: isCoverageEnabled,
coverageReporters: ['text-summary', 'lcov', 'html-spa'],
workerIdleMemoryLimit: '1MB',
};
if (process.env.CI === 'true') {
config.collectCoverageFrom = ['src/**/*.ts'];
config.reporters = ['default', 'jest-junit'];
config.coverageReporters = ['cobertura'];
}
module.exports = config;
(2)n8n/pageage.json
{
"name": "n8n-monorepo",
"version": "1.99.0",
"private": true,
"engines": {
"node": ">=22.16",
"pnpm": ">=10.2.1"
},
"packageManager": "pnpm@10.12.1",
"scripts": {
"prepare": "node scripts/prepare.mjs",
"preinstall": "node scripts/block-npm-install.js",
"build": "turbo run build",
"build:backend": "turbo run build:backend",
"build:frontend": "turbo run build:frontend",
"build:nodes": "turbo run build:nodes",
"typecheck": "turbo typecheck",
"dev": "turbo run dev --parallel --env-mode=loose --filter=!@n8n/design-system --filter=!@n8n/chat --filter=!@n8n/task-runner",
"dev:be": "turbo run dev --parallel --env-mode=loose --filter=!@n8n/design-system --filter=!@n8n/chat --filter=!@n8n/task-runner --filter=!n8n-editor-ui",
"dev:ai": "turbo run dev --parallel --env-mode=loose --filter=@n8n/nodes-langchain --filter=n8n --filter=n8n-core",
"dev:fe": "run-p start "dev:fe:editor --filter=@n8n/design-system"",
"dev:fe:editor": "turbo run dev --parallel --env-mode=loose --filter=n8n-editor-ui",
"dev:e2e": "cd cypress && pnpm run test:e2e:dev",
"debug:flaky:e2e": "cd cypress && pnpm run test:flaky",
"dev:e2e:server": "run-p start dev:fe:editor",
"clean": "turbo run clean --parallel",
"reset": "node scripts/ensure-zx.mjs && zx scripts/reset.mjs",
"format": "turbo run format && node scripts/format.mjs",
"format:check": "turbo run format:check",
"lint": "turbo run lint",
"lintfix": "turbo run lintfix",
"lint:backend": "turbo run lint:backend",
"lint:nodes": "turbo run lint:nodes",
"lint:frontend": "turbo run lint:frontend",
"optimize-svg": "find ./packages -name '*.svg' ! -name 'pipedrive.svg' -print0 | xargs -0 -P16 -L20 npx svgo",
"start": "run-script-os",
"start:default": "cd packages/cli/bin && ./n8n",
"start:tunnel": "./packages/cli/bin/n8n start --tunnel",
"start:windows": "cd packages/cli/bin && n8n",
"test": "JEST_JUNIT_CLASSNAME={filepath} turbo run test",
"test:backend": "turbo run test:backend --concurrency=1",
"test:frontend": "turbo run test:frontend --concurrency=1",
"test:nodes": "turbo run test:nodes --concurrency=1",
"watch": "turbo run watch --parallel",
"webhook": "./packages/cli/bin/n8n webhook",
"worker": "./packages/cli/bin/n8n worker"
},
"devDependencies": {
"@biomejs/biome": "^1.9.0",
"@n8n/eslint-config": "workspace:*",
"@types/jest": "^29.5.3",
"@types/node": "*",
"@types/supertest": "^6.0.3",
"babel-plugin-transform-import-meta": "^2.3.2",
"bundlemon": "^3.1.0",
"cross-env": "^7.0.3",
"jest": "^29.6.2",
"jest-environment-jsdom": "^29.6.2",
"jest-expect-message": "^1.1.3",
"jest-junit": "^16.0.0",
"jest-mock": "^29.6.2",
"jest-mock-extended": "^3.0.4",
"lefthook": "^1.7.15",
"nock": "^14.0.1",
"nodemon": "^3.0.1",
"npm-run-all2": "^7.0.2",
"p-limit": "^3.1.0",
"rimraf": "^5.0.1",
"run-script-os": "^1.0.7",
"supertest": "^7.1.1",
"ts-jest": "^29.1.1",
"tsc-alias": "^1.8.10",
"tsc-watch": "^6.2.0",
"turbo": "2.5.4",
"typescript": "*",
"zx": "^8.1.4"
},
"pnpm": {
"onlyBuiltDependencies": [
"sqlite3"
],
"overrides": {
"@azure/identity": "^4.3.0",
"@types/node": "^20.17.50",
"chokidar": "^4.0.1",
"esbuild": "^0.24.0",
"multer": "^2.0.1",
"prebuild-install": "7.1.3",
"pug": "^3.0.3",
"semver": "^7.5.4",
"tar-fs": "2.1.3",
"tslib": "^2.6.2",
"tsconfig-paths": "^4.2.0",
"typescript": "^5.8.2",
"vue-tsc": "^2.2.8",
"google-gax": "^4.3.7",
"ws": ">=8.17.1",
"zod": "3.25.67"
},
"patchedDependencies": {
"bull@4.16.4": "patches/bull@4.16.4.patch",
"pdfjs-dist@5.3.31": "patches/pdfjs-dist@5.3.31.patch",
"pkce-challenge@5.0.0": "patches/pkce-challenge@5.0.0.patch",
"@types/express-serve-static-core@5.0.6": "patches/@types__express-serve-static-core@5.0.6.patch",
"@types/ws@8.18.1": "patches/@types__ws@8.18.1.patch",
"@types/uuencode@0.0.3": "patches/@types__uuencode@0.0.3.patch",
"vue-tsc@2.2.8": "patches/vue-tsc@2.2.8.patch",
"eslint-plugin-n8n-local-rules": "patches/eslint-plugin-n8n-local-rules.patch",
"element-plus@2.4.3": "patches/element-plus@2.4.3.patch"
}
}
}
(3)n8n/codecov.yml
codecov:
max_report_age: off
require_ci_to_pass: true
coverage:
status:
patch: false
project:
default:
threshold: 0.5
github_checks:
annotations: false
flags:
tests:
paths:
- '**'
carryforward: true
component_management:
default_rules:
statuses:
- type: project
target: auto
branches:
- '!master'
individual_components:
- component_id: backend_packages
name: Backend
paths:
- packages/@n8n/api-types/**
- packages/@n8n/config/**
- packages/@n8n/client-oauth2/**
- packages/@n8n/decorators/**
- packages/@n8n/constants/**
- packages/@n8n/backend-common/**
- packages/@n8n/backend-test-utils/**
- packages/@n8n/db/**
- packages/@n8n/di/**
- packages/@n8n/imap/**
- packages/@n8n/permissions/**
- packages/@n8n/task-runner/**
- packages/workflow/**
- packages/core/**
- packages/cli/**
- component_id: frontend_packages
name: Frontend
paths:
- packages/@n8n/codemirror-lang/**
- packages/frontend/**
- component_id: nodes_packages
name: Nodes
paths:
- packages/node-dev/**
- packages/nodes-base/**
- packages/@n8n/json-schema-to-zod/**
- packages/@n8n/nodes-langchain/**
statuses:
- type: project
target: auto
threshold: 0% # Enforce: Coverage must not decrease
ignore:
- (?s:.*/[^/]*.spec.ts.*)Z
- (?s:.*/[^/]*.test.ts.*)Z
- (?s:.*/[^/]*e2e[^/]*.ts.*)Z
六、如何使用 n8n
6.1 安装 n8n
n8n 的安装方式丰富多样,其中 Docker 安装和 npm 安装是最为常见的两种,以下为你详细介绍这两种安装方式的步骤和注意事项。
如果你选择使用 Docker 安装 n8n,首先要确保你的系统中已经安装了 Docker 。若尚未安装,可前往 Docker 官方网站,根据系统类型下载并安装对应的 Docker 版本 。安装完成后,打开命令行工具,执行以下命令拉取 n8n 镜像:
docker pull n8nio/n8n
拉取完成后,使用以下命令运行 n8n 容器:
docker run -it --rm
--name n8n
-p 5678:5678
-v ~/.n8n:/home/node/.n8n
n8nio/n8n
在上述命令中,-p 5678:5678表示将容器内的 5678 端口映射到主机的 5678 端口 ,这样我们就可以通过浏览器访问http://localhost:5678来使用 n8n 。-v ~/.n8n:/home/node/.n8n则是将主机的~/.n8n目录挂载到容器内的/home/node/.n8n目录 ,用于数据的持久化存储,防止容器重启后数据丢失 。
使用 Docker 安装 n8n 的优势在于环境的一致性和便捷性,无论在何种操作系统上,只要安装了 Docker,都能以相同的方式安装和运行 n8n 。不过,需要注意的是,在生产环境中,可能需要对容器的资源限制、网络配置等进行进一步优化 。同时,由于 Docker 镜像会不断更新,在更新镜像时,要注意版本兼容性,避免因版本问题导致 n8n 无法正常运行 。
如果你对 Node.js 环境比较熟悉,也可以选择使用 npm 安装 n8n 。在安装之前,要确保你的服务器或计算机上已经安装了 Node.js ,并且建议安装 n8n 官方文档推荐的 Node.js 版本 。你可以通过访问 Node.js 官方网站下载并安装 。npm 通常会随 Node.js 一起安装,安装完成后,可以在终端或命令提示符中运行npm -v来检查 npm 是否已安装及其版本 。
确认 Node.js 和 npm 安装无误后,在终端或命令提示符中运行以下命令来全局安装 n8n:
npm install -g n8n
-g标志表示全局安装,这样你就可以在任何目录下运行 n8n 命令 。安装完成后,使用以下命令启动 n8n 服务:
n8n start
默认情况下,n8n 会监听http://localhost:5678 。在生产环境中,通常需要将 n8n 作为后台服务运行,并在服务器重启后自动启动 。可以使用 pm2 等工具来实现这一目的 。首先全局安装 pm2:
npm install -g pm2
然后使用 pm2 启动 n8n:
pm2 start n8n
pm2 save # 保存当前进程列表,以便在服务器重启后自动恢复
pm2 startup # 配置pm2在系统启动时自动启动
使用 npm 安装 n8n 的好处是可以更灵活地管理 n8n 的依赖和版本 。但需要自行管理 Node.js 运行环境,并且在安装和更新过程中,可能会遇到依赖冲突等问题 。此外,在生产环境中,还需要配置反向代理(如 Nginx 或 Apache)来处理 SSL 证书、域名和端口转发等 ,同时要确保服务器防火墙允许访问配置的 n8n 端口(默认为 5678) 。
6.2 创建工作流
下面以创建一个简单的邮件通知工作流为例,演示如何在 n8n 中添加触发器、节点及配置参数的流程 。假设我们希望当 GitHub 上有新的代码提交时,自动发送邮件通知相关人员 。
首先,登录 n8n 的 Web 界面,在左侧菜单栏中点击 “Workflows”,然后点击 “Create new workflow” 创建一个新的工作流 。进入工作流编辑界面后,在左侧的节点列表中找到 “GitHub” 节点,将其拖拽到中间的画布上 。在弹出的 “GitHub” 节点配置窗口中,点击 “Create new credential”,输入你的 GitHub 账号和密码,完成认证信息的配置 。配置完成后,在 “Events” 选项中选择 “Push event”,表示当有代码推送事件发生时触发该节点 。
接下来,从节点列表中找到 “Email (SMTP)” 节点,将其拖拽到画布上,并将 “GitHub” 节点与 “Email (SMTP)” 节点连接起来 。在 “Email (SMTP)” 节点配置窗口中,点击 “Create new credential”,配置 SMTP 服务器的相关信息,包括发件人邮箱地址、密码、SMTP 服务器地址和端口等 。配置完成后,在 “To” 字段中填写收件人的邮箱地址,在 “Subject” 字段中填写邮件主题,如 “GitHub 代码提交通知” 。在 “Message” 字段中,可以使用 n8n 的表达式语法,引用 “GitHub” 节点传递过来的数据,例如,使用{{$node["GitHub"].json.commits[0].message}}来显示最新一次代码提交的信息 。
配置完成后,点击工作流编辑界面右上角的 “Save” 按钮保存工作流 。然后,点击 “Execute workflow” 按钮手动测试工作流,检查是否能够正常发送邮件 。如果一切正常,当 GitHub 上有新的代码提交时,n8n 就会自动触发这个工作流,将代码提交信息通过邮件发送给指定的收件人 。
在创建工作流的过程中,要注意节点之间的连接顺序和数据传递关系 。每个节点的配置参数都要根据实际需求进行准确设置,特别是涉及到认证信息和数据格式的部分 。同时,n8n 提供了丰富的节点和功能,可以根据不同的业务场景进行灵活组合和扩展 。例如,如果需要对代码提交信息进行更复杂的处理,可以在 “GitHub” 节点和 “Email (SMTP)” 节点之间添加 “Function” 节点,使用 JavaScript 代码对数据进行处理和转换 。
6.3 调试与优化
在工作流开发过程中,调试是必不可少的环节 。n8n 提供了强大的调试工具,帮助我们快速排查问题 。当工作流出现异常时,首先可以在工作流编辑界面中,点击画布下方的 “Executions” 标签,查看工作流的执行历史记录 。在执行记录中,可以看到每个节点的执行状态、输入和输出数据等信息 。如果某个节点执行失败,会显示相应的错误信息,根据这些信息可以初步判断问题所在 。
此外,n8n 还支持单步调试功能 。在工作流编辑界面中,点击需要调试的节点上的小箭头图标,即可进入单步调试模式 。在单步调试模式下,可以逐节点查看工作流的执行情况,检查每个节点的输入数据是否正确,节点的配置是否符合预期,以及节点的输出数据是否满足后续节点的需求 。通过这种方式,可以逐步定位到问题的根源 。
除了使用调试工具排查问题,根据日志进行工作流优化也是提高工作流性能和稳定性的重要手段 。n8n 的日志记录非常详细,包括工作流的触发时间、执行时长、节点执行结果等信息 。通过分析这些日志,可以了解工作流的运行状况,发现潜在的性能瓶颈和问题 。例如,如果发现某个工作流执行时间过长,可以检查是否存在不必要的节点操作或数据处理步骤,尝试优化节点配置或调整工作流逻辑,以提高执行效率 。
同时,还可以根据日志来优化错误处理机制 。如果某个节点经常出现错误,可以根据错误信息调整节点的配置或添加重试机制 。例如,对于因网络波动导致的 API 调用失败,可以设置节点在失败后自动重试一定次数,提高工作流的容错能力 。此外,还可以根据日志中的错误信息,针对性地发送错误通知,确保问题能够及时得到处理 。通过不断地调试和优化,能够使 n8n 工作流更加稳定、高效地运行,满足实际业务的需求 。
七、总结与展望
n8n 作为一款开源的工作流自动化平台,以其独特的优势在数字化领域中展现出了巨大的价值 。它不仅功能强大,涵盖了工作流自动化、丰富的集成能力、触发器和动作、数据转换、错误处理以及调试和日志记录等多个关键功能 ,而且技术原理先进,通过节点和连接、事件驱动、数据流、并行和顺序执行、容器化以及 Webhook 和 REST API 等技术,实现了高效、灵活的工作流自动化 。
在应用场景方面,n8n 在数据同步、客户关系管理、IT 自动化等多个领域都有着出色的表现,能够帮助企业和个人解决实际业务中的各种问题,提高工作效率和质量 。与其他类似工具相比,n8n 在功能的全面性、价格的优势(开源免费)、易用性和扩展性等方面都具有竞争力 ,为用户提供了更优的选择 。
随着数字化转型的加速和企业对自动化需求的不断增长,工作流自动化领域将迎来更广阔的发展空间 。n8n 有望在未来持续创新和发展,进一步拓展其功能和应用场景 。例如,在人工智能和大数据技术不断发展的背景下,n8n 可能会加强与这些技术的融合,实现更智能化的工作流自动化 。通过引入人工智能技术,n8n 可以自动分析工作流的执行数据,预测潜在的问题,并提供优化建议,从而进一步提高工作流的效率和可靠性 。
同时,n8n 也可能会不断完善其用户体验,降低使用门槛,使更多非技术人员能够轻松上手 。此外,随着企业对数据安全和隐私的关注度不断提高,n8n 在数据安全方面的表现也将成为其发展的关键因素之一 ,预计 n8n 会持续加强数据安全防护措施,确保用户数据的安全和隐私 。相信在未来,n8n 将在工作流自动化领域发挥更加重要的作用,为企业和个人带来更多的价值 。
解释关键词:
-
工作流自动化 :指利用工具或平台,按照预设规则自动执行一系列任务和流程,减少人工干预,提高工作效率和准确性,如将新订单信息自动发送给物流系统安排发货。
-
低代码 :指使用者无需编写大量代码,借助可视化界面、拖放等操作即可构建应用程序或工作流,使非技术人员也能轻松上手,像 n8n 通过拖放节点搭建工作流即体现了低代码特点。
-
节点 :在 n8n 中是工作流构建的基本单元,每个节点代表特定操作或数据点,如 HTTP Request 节点用于向 API 发送请求获取数据,通过连接节点可形成完整工作流逻辑。
-
集成能力 :指与不同应用、系统和服务进行连接和协同工作的能力,n8n 能集成超 500 种应用程序和服务,打破数据孤岛,实现数据流转和流程自动化。
-
触发器 :工作流的启动条件,基于特定事件触发工作流执行,如定时触发器可设定每天凌晨 2 点执行数据备份,Webhook 触发器接收外部 HTTP 请求触发流程。
-
动作 :工作流中执行的具体操作,对应特定功能节点,如发送邮件动作节点用于发送通知,读取文件动作节点获取文件内容。
-
数据转换 :对数据进行筛选、合并、格式化等处理,以满足不同节点和服务需求,如将日期格式由 “YYYY - MM - DD” 转换为 “MM/DD/YYYY”。
-
错误处理 :包括重试机制、错误通知、跳过出错步骤等功能,确保工作流稳定运行,如网络波动致 API 调用失败时自动重试,多次失败后发送通知。
-
调试 :工作流开发中用于定位和解决问题,n8n 可单步执行查看节点输入输出和执行详情,帮助判断问题所在。
-
日志记录 :记录工作流运行信息,如执行时间、触发事件、节点结果等,用于监控运行状态、排查问题和优化流程。
-
容器化 :n8n 支持基于 Docker 的容器化部署,保证环境一致性,便于移植到不同服务器或云平台,简化安装升级过程。
-
Webhook :一种实时 HTTP 回调机制,外部系统特定事件发生时向 n8n 发送通知,触发工作流执行,实现系统间实时通信协作。
-
REST API :允许外部系统与 n8n 深入交互,可查询工作流状态、获取结果,甚至创建修改工作流,拓展应用场景和功能。
-
开源 :n8n 的源代码公开,用户可自行搭建部署,无软件使用费用,能根据需求定制修改,有活跃社区支持和丰富文档。
-
扩展性 :指系统能适应业务增长和变化,通过扩展功能满足更多需求,n8n 支持自定义节点和容器化部署,可灵活扩展适应不同业务规模。
博主还写了与智能体相关文章,欢迎批评指正:
AI Agent实战30篇目录集绵:
第一章 Agent基本概念【共7篇】
1、AI Agent 介绍(1/30)
2、AI Agent:重塑业务流程自动化的未来力量(2/30)
3、AI Agent 实战:三步构建,七步优化,看智能体如何进入企业生产(3/30)
4、探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)
5、探秘多AI Agent模式:机遇、应用与未来展望(5/30)
6、探秘 AI Agent 之 Coze 智能体:工作流模式(6/30)
7、探秘 AI Agent 之 Coze 智能体:插件创建与使用(7/30)
第二章 Agent案例分析 【共8篇】
1、AI Agent案例全解析:百度营销智能体(8/30)
2、AI Agent案例与实践全解析:字节智能运维(9/30)
3、Agent 案例分析:金融场景中的智能体-蚂蚁金服案例(10/30)
4、华为 AI Agent:企业内部管理的智能变革引擎(11/30)
5、微众银行金融场景 Agent:创新实践与深度剖析(12/30)
6、京东物流营销 Agent:智能驱动,物流新篇(13/30)
7、数势科技:解锁数据分析 Agent 的智能密码(14/30)
8、南方电网场景中 Agent 的智慧赋能与创新实践(15/30)
第三章 AI Agent应用开发【6篇】
1、让 Agent 具备语音交互能力:技术突破与应用前景(16/30)
2、探寻AI Agent:开启知识图谱自动生成新篇章(17/30)
3、解锁AI Agent潜能:智能时代的信息处理利器(18/30)
4、解锁Agent的数据分析潜能,开启智能决策新时代(19/30)
5、解锁AI Agent潜能:LLaMA3-1-8B-Instruct WebDemo部署实战(20/30)
6、解锁AI Agent潜能:Llama3_1-8B-Instruct与FastApi实战(21/30)
第四章 多Agent框架【7篇】
1、探秘MetaGPT:革新软件开发的多智能体框架(22/30)
2、单智能体入门:开启智能新世界的钥匙(23/30)
3、多 Agent 框架入门:开启智能协作新时代(24/30)
4、探秘AutoGen框架:从入门到实践的全攻略(25/30)
5、探秘AutoGen:模型配置与代码执行全解析(26/30)
6、探索AutoGen:大模型时代的智能协作利器(27/30)
7、掌握AutoGen:轻松控制多Agent框架中的代理对话退出(28/30)
第五章 Agent与应用系统【1篇】
1、当AI Agent遇上CRM:客户关系管理的智能化变革(29/30)
第六章 智能体工具【1篇】
1、Text2Sql:开启自然语言与数据库交互新时代(30/30)
本文关联文章:
1、Windows10安装Docker Desktop(大妈看了都会)
2、02-pycharm详细安装教程(大妈看了都会)
3、Git 代码提交注释管理规范
4、代码管理Git官方推荐使用客户端工具SourceTree
5、解释 Git 的基本概念和使用方式。
6、postman介绍、安装、使用、功能特点、注意事项
7、2024年最新版IntelliJ IDEA下载安装过程(含Java环境搭建)
8、CodeGeeX一款基于大模型全能的智能编程助手
9、从0到1:Dify AI智能体部署与使用全攻略
10、探索RAGFlow:解锁生成式AI的无限潜能(2/6)
11、AI Agent 之 Coze 智能体,从简介到搭建全攻略(3/6)
12、FastGPT:开启大模型应用新时代(4/6)
13、解锁n8n:开启工作流自动化的无限可能(5/6)