External module in Code node not found by Task Runner despite being physically present and allowed

External module in Code node not found by Task Runner despite being physically present and allowed 这个报错出现在 n8n Code 节点中 require 外部 npm 包失败,即使包已物理安装在正确

快速结论:External module in Code node not found by Task Runner despite being physically present and allowed 这个报错出现在 n8n Code 节点中 require 外部 npm 包失败,即使包已物理安装在正确路径且已加入 NODE_FUNCTION_ALLOW_EXTERNAL 白名单。优先排查 Task Runner 的 require-resolver 解析逻辑,而非再次确认模块文件是否存在。

适用环境:n8n 2.36.8(Docker 自托管)、Node.js v24.18.1、PostgreSQL、Ubuntu 24.04 LTS 宿主机、Alpine 容器镜像(n8n/runner)。Internal 与 External Task Runner 两种模式均复现。

最快修复方案:暂无确认的一步修复方案。Issue 已在官方仓库关闭并转至社区论坛,未提供官方补丁或已验证的绕过方案。

注意事项:以下解决步骤均为基于 Issue 环境的推测性排查方向,可优先尝试但未被官方验证。若问题影响生产,建议同步在 n8n 社区论坛发帖跟进。

问题场景

用户在 n8n(2.36.8)的 Code 节点中执行 require('pdf-lib') 失败。模块已通过 npm install 安装并复制到 runner 实际解析路径,且已在环境变量与 runner 配置中显式白名单,但无论 Internal 还是 External Task Runner 模式都持续报错 Cannot find module 'pdf-lib'。External 模式中,修改 /etc/n8n-task-runners.json 后首先遇到 Module 'pdf-lib' is disallowed(默认仅放行 moment),随后即使白名单已生效(容器内 env 可验证),require 仍失败。

报错原文

Cannot find module 'pdf-lib'
Module 'pdf-lib' is disallowed [line 1]

原因分析

可能原因:模块文件物理存在且白名单已生效,但 n8n Task Runner 的 require-resolver.js 内部解析逻辑存在问题,未能将用户放入的路径纳入模块搜索范围。Issue 强调包已存在于 resolver 自身会检查的路径,且同社区已有 ioredis 案例出现相同“模块存在 + 已放行仍 not found”的现象,指向代码缺陷而非用户配置错误。

环境排查

  • 确认 n8n 版本:2.36.8(Docker 自托管)
  • 确认 Node.js 版本:v24.18.1(宿主机)
  • 确认数据库:PostgreSQL;执行模式:main
  • 确认容器镜像:n8n 官方镜像 + n8nio/runners:2.36.8(External 模式)
  • Internal 模式:确认模块复制路径 /usr/local/lib/node_modules/n8n/node_modules/pdf-lib 是否存在
  • External 模式:确认 runner 容器内 /home/runner/node_modules/pdf-lib 是否存在,以及 docker exec ... env | grep NODE_FUNCTION 是否已含 pdf-lib
  • 确认 NODE_FUNCTION_ALLOW_EXTERNAL=pdf-lib 已作为环境变量传给 n8n 主容器

解决步骤

  1. 先在社区论坛搜索 ioredisrequire-resolver 相关帖(Issue 中提及已有相同现象的 ioredis 报告),确认是否有已知 workaround。
  2. Internal 模式可尝试:将模块直接放入 n8n 持久化数据卷中的 node_modules 路径(如 /home/node/.n8n/node_modules/),而非容器内临时路径。
  3. External 模式可尝试:在 runner 容器的环境变量注入点(而非 /etc/n8n-task-runners.json 的 env-overrides)设置 NODE_FUNCTION_ALLOW_EXTERNAL=pdf-lib,然后重启 runner 容器。
  4. 确认 Dockerfile 中模块安装层与最终镜像层均保留模块文件,且未在后续 RUN 层中因 .dockerignore 或缓存问题被意外移除。
  5. 若上述均无效,建议在社区论坛反馈并附上本 Issue 链接,等待官方定位 require-resolver.js 的解析缺陷。

验证方法

在 Code 节点中执行 const pdfLib = require('pdf-lib'); return Object.keys(pdfLib).length;,若返回非零数字(表示模块已成功加载并导出对象),则说明问题已解决;若仍出现 Cannot find module 'pdf-lib',则模块解析问题依然存在。

参考来源

n8n-io/n8n #37891

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22017

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注