You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js模块引入正确方式:跨文件调用puppeteer模块报错问题

解决puppeteer在跨模块中未识别的问题

你遇到的核心问题是模块作用域隔离:puppeteer只在server.js的模块作用域内被引入,routes.js作为独立模块无法直接访问这个变量,所以会抛出"puppeteer is not defined"的错误。同时我注意到你的代码里还有一个拼写小错误(broswer应该是browser),这个也需要修正,否则即使解决了引入问题,函数执行还是会失败。

下面提供几种可行的解决方案:

方案1:在routes.js中直接引入puppeteer

这是最直观且推荐的方式,Node.js的模块系统会自动缓存已加载的模块,所以多次require不会重复加载,性能上没有问题。

修改你的routes.js文件:

// routes.js顶部添加引入
const puppeteer = require('puppeteer');

async function getPic(arg) { 
  const browser = await puppeteer.launch(/*{headless: false}*/); 
  const page = await browser.newPage(); 
  await page.goto(arg); 
  await page.setViewport({width: 1000, height: 500}) 
  await page.screenshot({path: 'pic.png'}); 
  await browser.close(); // 修正拼写错误:broswer → browser
}

方案2:从server.js传递puppeteer到routes.js

如果你希望统一在server.js管理依赖引入,可以通过参数传递或者模块初始化的方式把puppeteer注入到routes.js中:

方式A:修改getPic为接受参数的函数

// routes.js
async function getPic(arg, puppeteer) { // 新增puppeteer参数
  const browser = await puppeteer.launch(/*{headless: false}*/); 
  const page = await browser.newPage(); 
  await page.goto(arg); 
  await page.setViewport({width: 1000, height: 500}) 
  await page.screenshot({path: 'pic.png'}); 
  await browser.close();
}

module.exports = { getPic };

然后在server.js中调用时传入puppeteer:

// server.js
const puppeteer = require('puppeteer');
const { getPic } = require('./routes.js');

// 调用时传递puppeteer
getPic('https://example.com', puppeteer);

方式B:导出初始化函数注入依赖

// routes.js
let puppeteer;

// 初始化函数,接收外部传入的puppeteer
function init(_puppeteer) {
  puppeteer = _puppeteer;
}

async function getPic(arg) { 
  if (!puppeteer) {
    throw new Error('请先调用init初始化puppeteer');
  }
  const browser = await puppeteer.launch(/*{headless: false}*/); 
  const page = await browser.newPage(); 
  await page.goto(arg); 
  await page.setViewport({width: 1000, height: 500}) 
  await page.screenshot({path: 'pic.png'}); 
  await browser.close();
}

module.exports = { init, getPic };

在server.js中初始化:

// server.js
const puppeteer = require('puppeteer');
const routes = require('./routes.js');

// 初始化routes模块的puppeteer依赖
routes.init(puppeteer);

// 之后就可以正常调用getPic了
routes.getPic('https://example.com');

额外注意事项

  • 务必修正broswer.close()的拼写错误为browser.close(),否则会抛出"broswer is not defined"的新错误。
  • 如果你的项目使用ES模块(import/export)而非CommonJS(require/module.exports),只需把require换成import,逻辑保持一致即可。

内容的提问来源于stack exchange,提问作者user1584421

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:43:24