Node.js(CommonJS)嵌套函数内require导入常量为undefined的问题
问题原因与解决方案:Node.js中puppeteer嵌套函数里外部变量变为undefined
原因分析
- puppeteer的
page.$eval()(以及page.evaluate()这类执行浏览器端代码的方法),它的回调函数是在浏览器的前端上下文里运行的,和Node.js后端环境完全隔离。 - 你导入的
SRLoginCredentials是Node.js进程内的变量,浏览器上下文根本不知道这个变量的存在,所以打印出来自然是undefined。 - 外部的
console.log(SRLoginCredentials)能正常输出,是因为它运行在Node.js主进程里,可直接访问导入的变量。
解决方案
要把Node.js环境的变量传到浏览器上下文,得通过page.$eval()的第三个参数来传递:
修改main.js里的对应代码:
await page.waitForSelector('#APjFqb'); console.log(SRLoginCredentials); // 这里在Node环境,正常输出 // 把SRLoginCredentials作为第三个参数传入回调,回调里对应接收 await page.$eval('#email', (el, credentials) => { console.log(credentials); // 现在能正常访问到变量了 }, SRLoginCredentials);
补充说明
- 传递的变量必须是可序列化的(比如普通对象、字符串、数字),像函数、DOM元素这类无法序列化的内容传不了,你的
SRLoginCredentials是普通对象,完全符合要求。 - 浏览器上下文的回调里,没法直接使用Node.js里的任何模块或变量,所有依赖的值都得通过参数传递进去。
内容的提问来源于stack exchange,提问作者blubberbo
相关产品推荐
相关产品推荐

