假设这个代码
// puppeteer-manager.ts
import { Browser, executablePath, Page } from "puppeteer";
import puppeteerExtra from "puppeteer-extra";
import stealthPlugin from "puppeteer-extra-plugin-stealth";
puppeteerExtra.use(stealthPlugin());
interface PuppeteerInstance {
browser: Browser;
page: Page;
}
let instances: { [sessionId: string]: PuppeteerInstance } = {};
async function createPuppeteerInstance(
sessionId: string
): Promise<PuppeteerInstance> {
if (!instances[sessionId]) {
const browser = await puppeteerExtra.launch({
args: ["--no-sandbox"],
headless: false,
ignoreHTTPSErrors: true,
executablePath: executablePath(),
});
const page = await browser.newPage();
instances[sessionId] = { browser, page };
}
return instances[sessionId];
}
async function closePuppeteerInstance(sessionId: string): Promise<void> {
if (instances[sessionId]) {
const { browser } = instances[sessionId];
await browser.close();
delete instances[sessionId];
}
}
export { createPuppeteerInstance, closePuppeteerInstance };
所以这段代码负责创建puppeteer的新示例,并将它们存储在一个名为instances的变量中,sessionId作为键。
因此,我正在构建一个NextJS应用程序,让每个连接的用户都有自己的 puppet 师示例,以实现应用程序的预期。
所以我假设如果我在文件A中调用createPuppeteerInstance并将sessionId 1234作为会话ID传递给它,我将假设当我在文件B中使用相同的sessionId运行createPuppeteerInstance时,我应该获得相同的puppeteer示例,但出于某种原因,puppeteer-manager.ts中的变量示例没有存储不同的示例,并且每次我调用它时,createPuppeteerInstance都会创建一个新示例。我知道这只会在Express服务器中工作,所以我问/想知道问题是否与NextJS有关,它导致示例变量返回到空对象。
1条答案
按热度按时间wh6knrhe1#
🤣🤣🤣 所以我继续问同样的问题openAI ChatGPT和我这我得到的答案:
在Next.js应用程序中,instances变量可能被重置为空对象,这可能是由于Next.js处理服务器端呈现的方式,其中每个请求都由服务器的单独示例处理。
解决此问题的一种方法是将instances变量存储在所有请求共享的全局上下文中。这样,您可以在不同的文件中使用createPuppeteerInstance和closePuppeteerInstance函数,但仍然可以访问相同的instances对象。
一种方法是使用Node.js中的全局对象。全局对象是一个全局命名空间,可用于应用程序的所有部分。您可以使用它来存储要在所有请求之间共享的变量。
下面是一个示例,说明如何修改puppeteer-manager模块以将instances变量存储在全局对象中:
这对我很有效,所以让我知道,如果有一个简单的方法