Docker版Directus Flow:如何运行自定义函数执行Puppeteer?
解决方案:Directus Flow中集成Puppeteer的两种可行方式
针对你的需求,有两种直接可行的方案,都能绕过Run Script的限制,实现遍历数据并调用Puppeteer抓取内容的功能:
一、使用自定义函数(Run Function节点)
这是最贴合现有Flow流程的方案,直接在Flow中通过Run Function调用自定义扩展的服务器端代码:
创建自定义函数扩展
- 本地初始化一个Directus函数扩展项目,在
package.json中添加puppeteer依赖。 - 编写函数逻辑,接收Flow中Read Data返回的数组作为参数,遍历每个条目并执行Puppeteer抓取操作。
- 构建扩展后,将打包好的扩展目录挂载到Docker容器的
/directus/extensions目录下。
- 本地初始化一个Directus函数扩展项目,在
函数代码示例
export default async function handler(data) { const puppeteer = require('puppeteer'); const { items } = data; // 接收Read Data传入的数据集 for (const item of items) { const browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox', '--disable-setuid-sandbox'] // Docker环境下必须配置 }); const page = await browser.newPage(); await page.goto(item.target_url); // 假设数据集中包含目标URL字段 // 执行抓取逻辑,示例为获取页面标题 const title = await page.title(); console.log(`抓取结果: ${title}`); // 可选:将抓取结果写回Directus,更新对应条目字段 await data.$directus.items('your_collection').update(item.id, { scraped_data: title }); await browser.close(); } return { success: true }; }Flow中配置
在Flow里替换Run Script为Run Function节点,选择你创建的自定义函数,将Read Data的输出作为参数传入函数即可。
二、创建自定义API端点,通过Webhook调用
如果更倾向于通过API接口实现,可以构建自定义API扩展,再用Flow的Webhook节点触发:
构建自定义API扩展
- 创建一个Directus API扩展,添加POST类型的端点(比如
/scrape-data)。 - 在端点处理函数中,接收请求体里的数据集,遍历并执行Puppeteer抓取逻辑(逻辑和上述函数一致)。
- 将扩展挂载到Docker的
/directus/extensions目录下。
- 创建一个Directus API扩展,添加POST类型的端点(比如
Flow中配置
在Flow里添加Webhook节点,设置请求方法为POST,URL指向你的自定义API端点,将Read Data的输出作为请求体发送即可。
Docker环境注意事项
Puppeteer依赖系统级库,官方Directus镜像默认未安装,需额外配置:
- 若使用docker-compose,可在服务中添加
command字段,启动时自动安装依赖:services: directus: image: directus/directus:latest command: > sh -c "apt-get update && apt-get install -y libx11-xcb1 libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2 && npm start" - 也可以直接构建包含这些依赖的自定义Directus镜像,避免每次启动重复安装。
内容的提问来源于stack exchange,提问作者Viktor H. Morales
相关产品推荐
相关产品推荐

