express / puppeteer 节点应用程序中的内存泄漏?

Memory leak in express / puppeeter node app?

我是 express/node 的新手,正在尝试构建一个 api 端点以从网站检索 html :

// load express
const express = require('express');

// get app & port
const app = express();
const port = process.env.PORT || 3000 ;

// get current url parameter and process
app.get('/', function(req, res) {

const url = req.query.url;
const puppeteer = require('puppeteer') ;

(async () => {

    try {

        var browser = await puppeteer.launch({
            headless: true,
            devtools: false,
            ignoreHTTPSErrors: true,
            userDataDir: 'tmp' ,
            args: [
                '--no-sandbox',
                '--single-process',
                '--no-zygote',
                '--disable-setuid-sandbox',
                '--disable-gpu'
            ]
        });


       // build a new page
        const page = await browser.newPage()

        // set options
        await page.setViewport({width: 800, height: 600})
        await page.setDefaultNavigationTimeout( 30000 ) ;

        // start time
        var start = Date.now();

        // explore url
        try {

            // goto page
            const response = await page.goto(url, { waitUntil: 'load'} );

            // get http response code
            const response_status = response == null ? 0 : response.status() ;

            // get html
            const data = await page.evaluate(() => document.querySelector('*').outerHTML);

            // send result
            res.send({
                'success' : true,
                'url': url,
                'http_code' : response_status ,
                'time' :  Date.now() - start,
                'data' : data
            });
        }
        // catch errors
        catch( err ) {

            // get page error
            const page_error = err.toString()

            // send error
            res.send({
                'success' : false,
                'url': url,
                'error' : page_error,
                'time' :  Date.now() - start
            });
        }

    } catch (err) {

        // send error
        res.send({
            'success' : false,
            'url': url,
            'error' : err.toString(),
            'time' :  Date.now() - start
        });

    } finally {

        await browser.close();
    }

})();

})


// start app
app.listen(port);

当以每秒约 1 个请求的速率使用端点时,pm2 监控显示 http 延迟增加。

第一分钟:

~10 分钟后:

使用的内存似乎也从 140M 增加到更多(几分钟后增加到 500M):

不确定内存泄漏的来源。

正如 Matthias 所建议的那样,“require puppeeter”应该在路由功能之外。它解决了这个问题。愚蠢的错误。