用 JavaScript 代码节点,直接查询外部数据库的实战演示

2026-05-15 21 0

别再为了查个数据,手动去开 Navicat 了

笔者在 N8N大学 交流群里发现,很多刚接触 n8n 的朋友,遇到需要查数据库的场景时,第一反应是:“是不是得先写个 API,再让 n8n 去调用?”

其实大可不必。对于简单的查询、数据清洗或聚合,n8n 自带的 JavaScript 代码节点 就是一把瑞士军刀。它能让你直接在工作流里通过 Node.js 连接数据库,省去部署中间层服务的繁琐。

今天,笔者就带大家实战演示:如何用 Code 节点直接查询 PostgreSQL 数据库。这不仅能帮你省下服务器费用,还能让你的自动化流程响应速度提升一个档次。

准备工作:磨刀不误砍柴工

在开始写代码之前,我们需要确保环境就绪。这一步很关键,能避免后续 90% 的连通性问题。

  1. n8n 实例:无论是官方云服务还是自托管(Docker/CLI)均可。
  2. 数据库信息:你需要准备好数据库的 Host、Port、User、Password 以及 Database 名称。
  3. 网络连通性:这是最大的坑。如果你的 n8n 部署在 Docker 中,而数据库在本地,确保 Docker 容器能访问到宿主机的数据库端口(通常需要使用 host.docker.internal 或特定的网络配置)。

核心实操:三步搞定数据库查询

我们将构建一个简单的流程:触发 -> 连接数据库 -> 输出结果。这里我们以查询 PostgreSQL 为例,但思路对 MySQL、MongoDB 同样适用。

步骤一:安装必要的依赖包

n8n 的 Code 节点 运行在 Node.js 环境中。默认情况下,它没有安装数据库驱动。

在 n8n 的设置中找到 npm 包管理(通常在安装目录下或环境变量配置),安装 pg(PostgreSQL 的驱动):

npm install pg

如果你是用 Docker 部署的,通常需要进入容器执行,或者通过卷挂载 node_modules。如果是 n8n 官方云服务,通常预装了常用包,但为了保险起见,建议先在本地验证。

步骤二:配置 Code 节点

在 n8n 编辑器中,添加一个 Code 节点(在 Core 集合中)。选择模式为 “Run Once for All Items”(如果只是单次查询)或 “Run for Every Item”。

在 JavaScript Code 编辑器中,输入以下代码。注意替换你的数据库连接信息:

const { Client } = require('pg');

// 1. 配置数据库连接信息
const client = new Client({
  host: 'localhost',      // 你的数据库地址
  port: 5432,             // 端口
  user: 'postgres',       // 用户名
  password: 'your_password', // 密码
  database: 'my_db',      // 数据库名
  ssl: false,             // 根据实际情况开启
});

// 2. 定义查询函数
async function queryDatabase() {
  try {
    await client.connect(); // 建立连接
    
    // 这里写你的 SQL 语句
    const res = await client.query('SELECT id, email, created_at FROM users WHERE is_active = true LIMIT 5');
    
    // 3. 将查询结果返回给 n8n 的数据流
    // n8n 期望返回一个数组
    return res.rows; 
    
  } catch (error) {
    console.error('查询出错:', error);
    return [{ error: error.message }]; // 返回错误信息以便调试
  } finally {
    await client.end(); // 记得关闭连接,防止连接泄漏
  }
}

// 执行函数
return queryDatabase();

点击运行后,你应该能在节点下方的 Output 面板看到查询到的数据列表。

步骤三:处理返回数据

Code 节点的输出是一个 JSON 数组。比如上面的查询结果会变成:

[
  { "id": 1, "email": "user1@example.com", "created_at": "2023-10-01T10:00:00" },
  { "id": 2, "email": "user2@example.com", "created_at": "2023-10-02T11:00:00" }
]

接下来,你可以连接 Spreadsheet 节点导出 Excel,或者连接 Telegram 节点发送通知。n8n 会自动将这些数组项转化为独立的流程分支。

避坑指南:实战中的血泪教训

代码跑通了不代表万事大吉,生产环境中这两个坑笔者帮你踩过了:

  1. 连接泄露(Connection Leak):一定要在 try...catch 后使用 finally { await client.end(); }。如果你的 n8n 工作流长时间运行且频繁查询,不关闭连接会导致数据库连接池耗尽,直接拖垮数据库。
  2. 时区问题:n8n 的 Code 节点运行时区通常跟随服务器设置。如果你的数据库存的是 UTC 时间,而你需要本地时间显示,记得在 SQL 中转换,或者在 JS 中处理(例如使用 moment-timezone 库)。
  3. 敏感信息硬编码:上面的代码为了演示把密码写死了。在实际工作中,请使用 n8n 的 Credentials(凭据) 功能。你可以创建一个 “n8n 节点” 类型的凭据,然后在 Code 节点中通过 $credentials 调用,这样既安全又方便维护。

FAQ 问答

Q1: 为什么我的 Code 节点报错 “Cannot find module ‘pg’”?
A: 这说明依赖包没装好。如果是 Docker 用户,确保你挂载了正确的 node_modules 目录,或者直接进入容器内部执行 npm install pg

Q2: 能用这个方法写入数据(INSERT/UPDATE)吗?
A: 绝对可以。修改代码中的 client.query 语句为你的 INSERT/UPDATE 语句即可。建议在 n8n 中使用 “Run Once for All Items” 模式来处理批量写入。

Q3: n8n 有专门的数据库节点,为什么还要用代码节点?
A: n8n 的官方数据库节点(如 MySQL, PostgreSQL)虽然方便,但受限于节点功能。如果你需要复杂的 JOIN 查询、子查询,或者需要在查询后立即进行复杂的数据转换(如对象合并、递归处理),代码节点的灵活性是无可替代的。

总结与资源

掌握 Code 节点 连接数据库,意味着你拥有了将 n8n 变成“轻量级后端服务”的能力。它不仅解决了数据获取的源头问题,还让你的自动化流程拥有了处理复杂逻辑的能力。

如果你是 N8N大学 的学员,建议先在测试环境跑通这个流程,理解数据流转的机制后,再应用到生产环境。

在低代码的世界里,代码是兜底的底牌。—— N8N大学

相关文章

n8n webhook触发器在实际项目中,真的比定时任务更难用吗?
n8n webhook 接口数据如何实时写入数据库?
n8n webhook 安全验证:API密钥配置全指南
n8n webhook 失灵?试试这三款开源替代工具,零成本迁移
n8n webhook HTTPS证书配置:从Let‘s Encrypt到自签名证书的完整避坑指南
n8n webhook进阶:自动抓取邮件附件并触发后续流程的实战指南

发布评论