V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Shook
V2EX  ›  Node.js

puppeteer 的 goto 方法响应十分慢,可能是什么原因?

  •  
  •   Shook · 2020-08-16 12:46:32 +08:00 · 2379 次点击
    这是一个创建于 1341 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天想要实现个打印网页为 PDF 的功能,顺便学习 TypeScript 和 Nest.js 。 遇到了这些问题:

    1. 方法的返回值类型定为Promise<Buffer>,但也有可能返回 puppeteer 的Error,这时候返回值该咋写,也没错误提示
    2. page.goto()方法定了 5 秒的 timeout,但还是有可能触发超时错误,这个该咋办,真实浏览器响应很快
    3. 一堆 await 的代码该如何组织,错误该如何处理?

    附上代码:

    async generatePDFFromURL(url: string): Promise<Buffer> {
        return new Promise<Buffer>(async (resolve, reject) => {
          const browser = await puppeteer.launch(),
                page    = await browser.newPage();
    
          try {
            await page.goto(url, {
              timeout: 5000,
            });
          } catch(error) {
            reject(error);
          }
    
          const pdf = await page.pdf({
            format: 'A4',
          });
    
          await browser.close();
    
          resolve(pdf);
        });
      }
    
    2 条回复    2020-08-17 10:40:07 +08:00
    tmkook
        1
    tmkook  
       2020-08-16 12:58:38 +08:00 via Android   ❤️ 1
    goto 是要等全部资源加载完的,一旦有阻塞 5 秒肯定不够
    mauve
        2
    mauve  
       2020-08-17 10:40:07 +08:00
    ```javascript
    await page.waitForNavigation()
    await page.waitForSelector('[name="passwd"]')
    ```
    尝试一下这两种写法呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4981 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:41 · PVG 17:41 · LAX 02:41 · JFK 05:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.