How to fix memory leaks in Puppeteer and Node.js project hosted on fly.io?

My Puppeteer and Node.js project hosted on fly.io is crashing due to insufficient memory. I have removed all unused and global variables, but the memory leak is still present. How can I fix this issue?
i see memory increased, but still i Colden’t find solution.
Here is my puppeteer codes.


This is the puppeteer file.

"use strict";
const puppeteer = require("puppeteer");
const dotenv = require("dotenv");
dotenv.config();

module.exports = async function scraping() {
  let price1000 = null;
  try {
    const browser = await puppeteer.launch({
      ignoreDefaultArgs: ["--disable-extensions"],
      headless: true,
      slowMo: 10,
      args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-cache"],
    });
    const page = await browser.newPage();
    //* counting time
    const start = Date.now();
    await page.goto(process.env.URL);
    let price2000 = await page.evaluate(() => {
      return document.getElementById("price").textContent;
    });
    await page.click("#switchQuantity");
    //* -------------------------------//
    await page
      .waitForSelector("#price", {
        visible: true,
        hidden: false,
      })
      .then(async () => {
        price1000 = await page.evaluate(() => {
          return document.getElementById("price").textContent;
        });
        return price1000;
      });

    console.log("Took", Date.now() - start, "ms");
    browser.disconnect();
    console.log("line 48 puppeter js before run : ", process.memoryUsage());
    // console.log("line 48 pupper jsafter run : ", process.memoryUsage());
    return {
      price1000,
      price2000,
    };
  } catch (err) {
    browser.close();
    console.error(err);
  }
  console.time();
};

This is the nodemailer.js

"use strict";
const nodemailer = require("nodemailer");
const dotenv = require("dotenv");
const db = require("../sqllite/db");
const scrapingdata = require("./puppetter");
// const { setTimeout } = require("timers/promises");
dotenv.config();

//* with Gmail - generate password ,  //

async function main(emailadress) {
  try {
    let data = await scrapingdata(); //* prizes //
    console.log("line 35, start nodemailer process ", data);
    if (data) {
      let trasporter = nodemailer.createTransport({
        service: "gmail",
        auth: {
          user: process.env.GMAIL,
          pass: process.env.PASSCODE,
        },
      });

      //* Email Body //

      let email = await trasporter.sendMail({
        from: "[email protected]",
        to: emailadress,
        subject: `Vandag Mazoutprijs in Bilzen`,
        html: `Vandag Minimumprijs van mazout  op Bilzen ${data.price2000}  €/L voor2000L & ${data.price1000}€/L voor1000L `,
      });
      console.log("Message sent: %s", email.messageId);
    }
  } catch (e) {
    console.error(e);
  }
}

//* create list //
module.exports = async function list() {
  // let email_list = [];
  // email_list.length = 0; //* every time array need to be empty //
  try {
    db.all("SELECT email FROM mail", (err, rows) => {
      if (err) {
        console.error(err);
      }
      rows.forEach((row) => {
        // email_list.push(row.email);
        // console.log("line 51", row.email);
        main(row.email);
      });
      // email_list.forEach((element) => {
      //   main(element);
      // });
    });
    // email_list.length = 0; //* every time array need to be empty //
  } catch (e) {
    console.error("error 28 :", e);
  }
};

Yes. I have made several changes to my codes. And i see a big different. But still it crashed.
Theses are changes that I’m done so far.

  1. Puppeteer launch options, i removed // args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-cache"], and added args: ["--no-sandbox"],.
  2. used browser.close()
  3. used Promise.all to list() function.
"use strict";
const puppeteer = require("puppeteer");
const dotenv = require("dotenv");
dotenv.config();

module.exports = async function scraping() {
  const browser = await puppeteer.launch({
    headless: true,
    slowMo: 10,
    //! disable cache page //
    //! memory //
    args: ["--no-sandbox"],
    // args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-cache"],
  });
  try {
    let price1000 = null;
    let price2000 = null;
    const page = await browser.newPage();
    //* counting time
    const start = Date.now();
    await page.goto(process.env.URL);
    price2000 = await page.evaluate(() => {
      return document.getElementById("price").textContent;
    });
    await page.click("#switchQuantity");
    //* -------------------------------//
    await page
      .waitForSelector("#price", {
        visible: true,
        hidden: false,
        // timeout: 12000,
      })
      .then(async () => {
        price1000 = await page.evaluate(() => {
          return document.getElementById("price").textContent;
        });
        return price1000;
      });

    console.log("Took", Date.now() - start, "ms");
    browser.close();
    // browser.disconnect();
    return {
      price1000,
      price2000,
    };
  } catch (err) {
    browser.close();
    console.error(err);
  }
  console.time();
};

When my nodemail.js file execution use more memory.

"use strict";
const nodemailer = require("nodemailer");
const dotenv = require("dotenv");
const DB = require("../sqllite/db");
const scrapingdata = require("./puppetter");
dotenv.config();

//* with Gmail - generate password ,  //

async function main(emailadress) {
  try {
    let data = await scrapingdata(); //* prizes //
    if (data) {
      let trasporter = nodemailer.createTransport({
        service: "gmail",
        auth: {
          user: process.env.GMAIL,
          pass: process.env.PASSCODE,
        },
      });

      //* Email Body //

      let email = await trasporter.sendMail({
        from: "[email protected]",
        to: emailadress,
        subject: `xxxxxx`,
        html: `xxxxxx ${data.price2000}  €/L  & ${data.price1000}€/L `,
      });
      console.log("Message sent: %s", email.messageId);
    }
  } catch (e) {
    console.error(e);
  }
}

//* create list //
module.exports = async function list() {
  console.log(`need to open Database for this list() function`);
  try {
    const db = DB;
    const queryPromise = new Promise((resolve, reject) => {
      db.all("SELECT email FROM mail", (err, rows) => {
        if (err) {
          reject(err);
        } else {
          const emails = rows.map((row) => row.email);
          resolve(emails);
        }
      });
    });
    const emails = await queryPromise;
    await Promise.all(emails.map((email) => main(email)));
  } catch (e) {
    console.error("error 28 :", e);
  }
};