快速结论: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 主容器
解决步骤
- 先在社区论坛搜索
ioredis与require-resolver相关帖(Issue 中提及已有相同现象的 ioredis 报告),确认是否有已知 workaround。 - Internal 模式可尝试:将模块直接放入 n8n 持久化数据卷中的
node_modules路径(如/home/node/.n8n/node_modules/),而非容器内临时路径。 - External 模式可尝试:在 runner 容器的环境变量注入点(而非
/etc/n8n-task-runners.json的 env-overrides)设置NODE_FUNCTION_ALLOW_EXTERNAL=pdf-lib,然后重启 runner 容器。 - 确认 Dockerfile 中模块安装层与最终镜像层均保留模块文件,且未在后续 RUN 层中因
.dockerignore或缓存问题被意外移除。 - 若上述均无效,建议在社区论坛反馈并附上本 Issue 链接,等待官方定位 require-resolver.js 的解析缺陷。
验证方法
在 Code 节点中执行 const pdfLib = require('pdf-lib'); return Object.keys(pdfLib).length;,若返回非零数字(表示模块已成功加载并导出对象),则说明问题已解决;若仍出现 Cannot find module 'pdf-lib',则模块解析问题依然存在。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Bug]: Breaking change in LiteLLM 1.96+: managed MCP OAuth2 flow opens LiteLLM UI instead of the vendor authorization page](https://www.chat-gpts.plus/wp-content/uploads/2026/09/39665-f15a8979-768x403.jpg)