【问题标题】:How to pass response object to external callback function in puppeteer?如何将响应对象传递给 puppeteer 中的外部回调函数?
【发布时间】:2021-05-11 22:47:05
【问题描述】:

我试图将我的 puppeteer 代码模块化,并希望将 page.on 事件功能添加到不同的文件中。看起来我无法将响应对象发送到外部文件。我该怎么做?

ma​​in.js

const puppeteer = require('puppeteer');
const sniffer = require('./sniffer.js')

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('https://www.google.com/')

  page.on('response', sniffer(response) );
  
  /** currently working like this
  page.on('response', async (response) => { 
  /** sniffer code **/
  })
  **/

  await browser.close()
})()

sniffer.js

async function sniffResponse (response) {
    /** sniffer code **/
}

module.exports.sniffer = sniffResponse;

【问题讨论】:

    标签: javascript node.js web-scraping puppeteer


    【解决方案1】:
    1. page.on()(或更一般的eventEmitter.on())需要对函数的引用作为事件处理程序。将调用括号添加到函数时,会将对函数的引用替换为函数返回的结果。所以你只需要page.on('response', sniffer);

    2. response 参数自动提供给处理程序。您可以在event signature 的文档中看到这一点。因此,您无需更改 sniffer.js 中的任何内容。

    3. 看来您还需要编辑导入行。试试:

    const { sniffer } = require('./sniffer.js');
    

    或:

    const sniffer = require('./sniffer.js').sniffer;
    

    【讨论】:

    • 我先尝试过,然后出现“处理程序不是函数”错误。
    • @coolsaint 抱歉,另请参阅答案中的第 3 项。使用当前导入,您将所有 module.exports 导入为 sniffer,而不是 module.exports.sniffer
    猜你喜欢
    • 2017-10-18
    • 2016-09-03
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多