NodeJS 异步主函数未退出

Kar*_*B25 3 javascript program-entry-point asynchronous node.js puppeteer

目前正在开发一个小型 NodeJS 项目,其中涉及 Puppeteer 库。我遇到的问题是 index.js 中的 main() 函数似乎永远不会退出。所有代码都运行良好,但在 VS code 中看起来程序仍在运行。

下面是一些示例代码:

var UserAgent = require('user-agents');
const userAgent = new UserAgent();
const puppeteer = require('puppeteer-extra');

const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

class TS {
    constructor() {
        let page;
    }
    
    async init() {
        const browser = await puppeteer.launch({ headless: false });
        this.page = await browser.newPage();
        await this.page.setUserAgent(userAgent.toString());        
    }
}


async function main(params) {
    console.log("Started main..");
    const ts = new TS();
    await ts.init();
    console.log("Ending main..");
}

main().catch(e => console.error(e));;
Run Code Online (Sandbox Code Playgroud)

如果我在 VS code 终端中运行上述代码,输出将显示:

开始主程序..结束主程序..(空行)

该程序现在将无限期地保持在这种状态,直到我按下 ctrl + C。如果我删除等待的 ts.init() 调用,那么它将按预期工作并且我的终端显示

开始 main.. 结束 main.. PS C:\Users\username\Desktop\nodejs-projects\my-project>

谁能解释一下这是怎么回事?

从我所做的所有研究中,我能想到的最好的办法是事件循环存在一些问题,尽管我真的不知道是什么原因造成的。

将 .then() 添加到 main() 中,类似这样可以解决问题

    .then(() => {
    setTimeout(() => {
        process.exit(0);
    }, 5000);;
})
Run Code Online (Sandbox Code Playgroud)

这证明了自从调用 setTimeout() 以来,promise 就得到了解决。但是,如果 main 解析并且没有剩余代码可以运行,我很困惑为什么程序在不调用 process.exit() 的情况下不会自动结束。非常感谢一些帮助。

Kar*_*B25 7

太有趣了。一整天都在寻找解决方案,当我将其发布到 stackoverflow 时,我就找到了它。

找到这个包,它可以帮助指出诸如阻止节点退出的打开连接之类的事情:why-is-node-running

接下来我发现打开的 puppeteer 连接到打开的 chrome 浏览器需要用这样的东西来关闭:

async close() {
    await this.browser.close();
}
Run Code Online (Sandbox Code Playgroud)

我没有删除这个问题,而是想发布这个问题,以防其他人有时也遇到同样的头痛。