解锁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.jsmoduleNameMapper: compilerOptions?.paths? pathsToModuleNameMapper(compilerOptions.paths, {prefix: `<rootDir>${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: offrequire_ci_to_pass: truecoverage:status:patch: falseproject:default:threshold: 0.5github_checks:annotations: falseflags:tests:paths:- '**'carryforward: truecomponent_management:default_rules:statuses:- type: projecttarget: autobranches:- '!master'individual_components:- component_id: backend_packagesname: Backendpaths:- 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_packagesname: Frontendpaths:- packages/@n8n/codemirror-lang/**- packages/frontend/**- component_id: nodes_packagesname: Nodespaths:- packages/node-dev/**- packages/nodes-base/**- packages/@n8n/json-schema-to-zod/**- packages/@n8n/nodes-langchain/**statuses:- type: projecttarget: autothreshold: 0% # Enforce: Coverage must not decreaseignore:- (?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 n8npm2 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 将在工作流自动化领域发挥更加重要的作用,为企业和个人带来更多的价值 。

解释关键词:

  1. 工作流自动化 :指利用工具或平台,按照预设规则自动执行一系列任务和流程,减少人工干预,提高工作效率和准确性,如将新订单信息自动发送给物流系统安排发货。

  2. 低代码 :指使用者无需编写大量代码,借助可视化界面、拖放等操作即可构建应用程序或工作流,使非技术人员也能轻松上手,像 n8n 通过拖放节点搭建工作流即体现了低代码特点。

  3. 节点 :在 n8n 中是工作流构建的基本单元,每个节点代表特定操作或数据点,如 HTTP Request 节点用于向 API 发送请求获取数据,通过连接节点可形成完整工作流逻辑。

  4. 集成能力 :指与不同应用、系统和服务进行连接和协同工作的能力,n8n 能集成超 500 种应用程序和服务,打破数据孤岛,实现数据流转和流程自动化。

  5. 触发器 :工作流的启动条件,基于特定事件触发工作流执行,如定时触发器可设定每天凌晨 2 点执行数据备份,Webhook 触发器接收外部 HTTP 请求触发流程。

  6. 动作 :工作流中执行的具体操作,对应特定功能节点,如发送邮件动作节点用于发送通知,读取文件动作节点获取文件内容。

  7. 数据转换 :对数据进行筛选、合并、格式化等处理,以满足不同节点和服务需求,如将日期格式由 “YYYY - MM - DD” 转换为 “MM/DD/YYYY”。

  8. 错误处理 :包括重试机制、错误通知、跳过出错步骤等功能,确保工作流稳定运行,如网络波动致 API 调用失败时自动重试,多次失败后发送通知。

  9. 调试 :工作流开发中用于定位和解决问题,n8n 可单步执行查看节点输入输出和执行详情,帮助判断问题所在。

  10. 日志记录 :记录工作流运行信息,如执行时间、触发事件、节点结果等,用于监控运行状态、排查问题和优化流程。

  11. 容器化 :n8n 支持基于 Docker 的容器化部署,保证环境一致性,便于移植到不同服务器或云平台,简化安装升级过程。

  12. Webhook :一种实时 HTTP 回调机制,外部系统特定事件发生时向 n8n 发送通知,触发工作流执行,实现系统间实时通信协作。

  13. REST API :允许外部系统与 n8n 深入交互,可查询工作流状态、获取结果,甚至创建修改工作流,拓展应用场景和功能。

  14. 开源 :n8n 的源代码公开,用户可自行搭建部署,无软件使用费用,能根据需求定制修改,有活跃社区支持和丰富文档。

  15. 扩展性 :指系统能适应业务增长和变化,通过扩展功能满足更多需求,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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910341.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据赋能(308)——合作共享——数据交流

概述 重要性如下&#xff1a; 信息准确性&#xff1a;数据交流原则确保在数据传递过程中信息的准确性&#xff0c;这是决策和业务活动的基础。决策支持&#xff1a;准确的数据交流为决策提供有力支持&#xff0c;帮助组织做出更明智的决策。业务效率&#xff1a;有效的数据交…

TCP流量控制与拥塞控制:核心机制与区别

一、TCP流量控制&#xff08;Flow Control&#xff09; 定义&#xff1a;通过调节发送方的发送速率&#xff0c;确保接收方能够及时处理数据&#xff0c;避免缓冲区溢出。 本质&#xff1a;解决发送方与接收方之间的"端到端"速率匹配问题。 1. 实现机制&#xff1a…

iOS多端兼容性调试:一次iOS性能优化分工具协作排查过程

在多技术栈混合开发日益普及的今天&#xff0c;iOS应用中越来越多地集成了WebView、Flutter、React Native甚至小程序模块。而这些模块带来的复杂性&#xff0c;不仅体现在UI适配&#xff0c;还包括数据同步、系统权限管理、线程调度等方面的问题。 本文记录的是我们在处理一个…

秋招Day14 - MySQL - 索引

索引为什么能够提高MySQL的查询效率&#xff1f; 索引可以理解为目录&#xff0c;通过索引可以快速定位数据&#xff0c;避免全表扫描 一般是B树结构&#xff0c;查找效率是O(log n)。 索引还能加速排序、分组、连接等操作。 create index idx_name on students(name); 能简…

第5天:LSTM预测火灾温度

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 复用LSTM模型实现火灾温度预测 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &am…

目标检测之YOLOV11自定义数据使用OBB训练与验证

一、前置条件与环境准备 在开始训练前&#xff0c;确保已完成以下准备《目标检测之YOLOV11自定义数据预处理——从原始标注到YOLO-OBB格式转换与验证》&#xff1a; 数据目录结构&#xff1a; yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程进阶一(Labview与OPC UA设备通信)

1.Labview与OPC UA设备通信 OPC UA通信协议优势显著,具体表现如下: 跨平台兼容:支持多种操作系统和硬件平台,实现无缝数据交换。高安全性:内置加密、身份验证和授权机制,确保数据传输安全。高效数据交换:采用二进制编码和优化的传输协议,提高通信效率。复杂数据建模:…

【Comsol教程】如何求解指定范围的积分 或 在积分中去除奇异点/异常值

我们在Comsol中经常需要对物体的边界求积分&#xff0c;比如求物体在流场中所受的总流体牵引力&#xff0c;又或者是物体在电场中受到的总介电泳力。当物体的材料或者边界条件存在突变时&#xff0c;物体表面的粘性应力或者麦克斯韦电应力可能会存在异常值。通常解决方法有细化…

Python 多版本治理理念(Windows 平台 · 零基础友好)

&#x1f9e0; Python 多版本治理理念&#xff08;Windows 平台 零基础友好&#xff09; &#x1f310; 核心原则&#xff1a;三维治理、四级隔离、五项自治 以下是基于人工智能深度学习环境搭建实践&#xff0c;总结出的"零基础入门 Conda工具链 全隔离项目环境"…

Python文件管理利器之Shutil库详解

Shutil是一个Python内置的用来高效处理文件和目录迁移任务的库。Shutil不仅支持基本的文件复制、移动和删除操作&#xff0c;还具备处理大文件、批量迁移目录、以及跨平台兼容性等特性。通过使用Shutil&#xff0c;我们可以更加轻松地实现文件系统的管理和维护&#xff0c;本文…

学习华为 ensp 的学习心得体会

引言​ 在信息技术日新月异的今天&#xff0c;网络技术作为连接世界的桥梁&#xff0c;其重要性不言而喻。作为一名对网络技术充满热情的大一新生&#xff0c;我选择了 eNSP&#xff08;Enterprise Network Simulation Platform&#xff0c;企业网络模拟平台&#xff09;作为我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一个小案例讲解:控制面板(GUI)

# 好吧&#xff0c;每天更新实在有点艰巨&#xff0c;我尽量少量多次 代码仓 所有代码都会上传到这里&#xff0c;可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 运行效果图 ​ 知识要点 一、安装dat.gui npm i dat.gui 二、使用步骤&a…

飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究

以下是一篇关于飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究的论文 ,涵盖理论分析、数学模型构建、控制策略设计及仿真验证等内容,适用于电气工程、新能源技术等领域的研究参考。 飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究 摘要 随着风电在电力…

一次性理解Java垃圾回收--简单直接方便面试时使用

Java的垃圾回收是一个面试必问题&#xff0c;只要按照下面的步骤回答肯定不会有大问题。 1.先告诉面试官垃圾回收分为两大步&#xff1a; a.识别哪些对象是"垃圾"(不再被使用的对象) b.回收这些垃圾对象占用的内存空间 2. 接下来分别介绍标记阶段和回收阶段的细节…

XML映射文件-辅助配置

如果你没有按照同包同名来&#xff0c;就要下面的配置&#xff0c;指定好路径 1.把路径改为类下面的xml文件 #指定xml映射文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xml

120、三角形最小路径和

题目 解答&#xff1a; 直接按照空间复杂度O(n)来做了。这种明显是动态规划&#xff0c;每一层用到上一层的信息。 观察数据形状&#xff0c;如下&#xff1a; (0,0) (1,0)(1,1) (2,0)(2,1)(2,2) (3,0)(3,1)(3,2)(3,3) ... (n-1,0)...(n-1,n-1) 设dp[n],定义为本层第n…

仕么是Transformer以及工作原理和架构

Transformer 是一种革命性的**深度学习架构**&#xff0c;由 Google 团队在 2017 年论文《Attention is All You Need》中提出。它彻底改变了自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并逐渐扩展到计算机视觉、语音识别等多模态任务。其核心创新在于**完全依赖…

opencv 锁页内存的使用

在OpenCV的CUDA编程中&#xff0c;cv::cuda::HostMem类用于管理锁页内存&#xff08;Page-Locked Memory&#xff09;​&#xff0c;这种内存能显著提升主机&#xff08;CPU&#xff09;与设备&#xff08;GPU&#xff09;间的数据传输效率。而.createMatHeader()正是将HostMem…

亚远景-ASPICE与ISO 26262:理解汽车软件质量保障的双标体系

在汽车行业向智能化、电动化转型的背景下&#xff0c;ASPICE&#xff08;Automotive SPICE&#xff09;与ISO 26262作为汽车软件质量保障的两大核心标准&#xff0c;分别从过程能力与功能安全两个维度构建了完整的开发管理体系。以下从标准定位、核心差异、协同实践及行业价值四…