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

如何触发Puppeteer的.on事件?关闭浏览器未处理会报错

解决Puppeteer中获取授权码后移除response事件监听器的问题

你遇到的核心问题是匿名事件监听器无法通过page.off移除,因为page.off需要引用绑定的具体函数。另外直接关闭浏览器可能因未处理完的异步事件报错,正确的做法是先移除监听器再关闭浏览器。

解决方案步骤:

  • 将原来的匿名回调函数抽成具名函数,让page.off能精准找到要移除的监听器
  • 在获取到authorizationCode后,调用page.off('response', 函数名)移除监听器
  • 确保监听器移除后再执行browser.close(),避免异步操作冲突导致报错

修改后的代码示例:

// 定义具名的响应处理函数
async function handleResponse(resp) {
  if (resp.url().includes("navigator.successRedirect")) {
    let code = await page.$eval("pre", el => el.textContent);
    code = JSON.parse(code).authorizationCode;
    console.log(code);
    
    // 移除当前绑定的response事件监听器
    page.off("response", handleResponse);
    
    // 监听器移除完成后再关闭浏览器
    await browser.close();
  }
}

// 绑定事件监听器
page.on("response", handleResponse);

关键说明:

  • 原来的page.off('response', this)无效,因为this在匿名函数中的指向不是当前回调函数,且匿名函数无法被page.off定位到
  • 把回调抽成具名函数后,page.on和page.off使用同一个函数引用,就能正确移除监听器
  • 先移除监听器再关闭浏览器,能避免浏览器关闭时还有未完成的响应监听异步操作,从而消除报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:57:21