NodeJS 如何在Nextjs服务器文件之间传递数据

ikfrs5lh  于 2022-12-22  发布在  Node.js
关注(0)|答案(1)|浏览(216)

假设这个代码

// 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有关,它导致示例变量返回到空对象。

wh6knrhe

wh6knrhe1#

🤣🤣🤣 所以我继续问同样的问题openAI ChatGPT和我这我得到的答案:
在Next.js应用程序中,instances变量可能被重置为空对象,这可能是由于Next.js处理服务器端呈现的方式,其中每个请求都由服务器的单独示例处理。
解决此问题的一种方法是将instances变量存储在所有请求共享的全局上下文中。这样,您可以在不同的文件中使用createPuppeteerInstance和closePuppeteerInstance函数,但仍然可以访问相同的instances对象。
一种方法是使用Node.js中的全局对象。全局对象是一个全局命名空间,可用于应用程序的所有部分。您可以使用它来存储要在所有请求之间共享的变量。
下面是一个示例,说明如何修改puppeteer-manager模块以将instances变量存储在全局对象中:

// 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;
}

// Initialize the instances object in the global namespace
global.instances = global.instances || {};

async function createPuppeteerInstance(
  sessionId: string
): Promise<PuppeteerInstance> {
  if (!global.instances[sessionId]) {
    const browser = await puppeteerExtra.launch({
      args: ["--no-sandbox"],
      headless: false,
      ignoreHTTPSErrors: true,
      executablePath: executablePath(),
    });
    const page = await browser.newPage();
    global.instances[sessionId] = { browser, page };
  }
  return global.instances[sessionId];
}

async function closePuppeteerInstance(sessionId: string): Promise<void> {
  if (global.instances[sessionId]) {
    const { browser } = global.instances[sessionId];
    await browser.close();
    delete global.instances[sessionId];
  }
}

export { createPuppeteerInstance, closePuppeteerInstance };

这对我很有效,所以让我知道,如果有一个简单的方法

相关问题