在Puppeteer的evaluate中传自定义函数报错:parseToNumber is not a function
问题原因及修复方案
核心错误:语法结构混乱
你在puppeteer.launch()的配置对象内部直接编写了let page = await browser.newPage();,这是严重的语法错误——launch()的参数是配置对象,不能在对象内部放置变量声明和await语句,这会导致整个函数执行逻辑混乱,进而引发后续参数传递异常,最终出现parseToNumber is not a function的报错。
修复后的完整代码
const parseToNumber = (inputString) => { const cleanedString = inputString.replace(/[^0-9a-zA-Z]+/g, ''); const numberValue = parseInt(cleanedString); return numberValue; } async function getData(){ try { let browser = await puppeteer.launch({ headless: false, slowMo: 100, defaultViewport: { width: 1280, height: 1024, } }); // 正确闭合launch调用 let page = await browser.newPage(); // 将page创建逻辑移到launch外部 const url= "MY_URL"; await page.goto(url, { waitUntil: "networkidle0", }); // evaluate回调无需async,因为parseToNumber是同步函数 const result = await page.evaluate((parseToNumber)=>{ return parseToNumber("2,42$"); }, parseToNumber); console.log(result); // 可打印结果验证功能是否正常 await browser.close(); // 记得关闭浏览器释放资源 } catch (err) { console.log("error loading url", err); } } getData();
额外说明
- Puppeteer的
page.evaluate()会将传入的函数序列化后注入页面上下文执行,箭头函数可以正常传递,但必须保证外层语法无错误,否则参数传递会直接失效。 - 原代码给
evaluate回调添加了async,但内部没有异步操作,完全可以去掉,避免不必要的异步嵌套。 - 改用
try/catch包裹整个逻辑,比链式catch更清晰,也能覆盖更多执行环节的错误。
内容的提问来源于stack exchange,提问作者yavgz
相关产品推荐
相关产品推荐

