javascript NextJS在中间件和API路由中给出了同一个单例类的不同示例[重复]

mlnl4t2r  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(155)

此问题已在此处有答案

How to prevent Next.js from instantiating a singleton class/object multiple times?(1个答案)
昨天关门了。
我有下面的实用函数,它只是一个用于存储计数器的单例类。

export class CounterSingleton {
  private static instance: CounterSingleton;
  private count: number;

  private constructor() {
    this.count = 0;
  }

  public static getInstance(): CounterSingleton {
    if (!CounterSingleton.instance) {
      CounterSingleton.instance = new CounterSingleton();
    }
    return CounterSingleton.instance;
  }

  public increment(): void {
    this.count++;
  }

  public getCount(): number {
    return this.count;
  }
}

我希望计数器类示例可以在API路由中访问。我对此没有意见。

// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import { CounterSingleton } from "@/utility/counter";
import type { NextApiRequest, NextApiResponse } from "next";

type Data = {
  counter: number;
};

export default function handler(
  req: NextApiRequest,
  res: NextApiResponse<Data>
) {
  const counter = CounterSingleton.getInstance();
  counter.increment();
  res.status(200).json({ counter: counter.getCount() });
}

第一次API调用:[详细]
第二次API调用:{ counter:2 }
当我访问中间件中的同一个计数器类时。它总是给我0的计数器。

import { NextResponse } from "next/server";
import { CounterSingleton } from "./utility/counter";

export function middleware() {
  const counter = CounterSingleton.getInstance();
  console.log(counter.getCount());
  return NextResponse.next();
}

有人能解释一下为什么中间件中的单例示例不同吗?

j2cgzkjk

j2cgzkjk1#

中间件可以在API路由之前执行。这意味着API尚未递增CounterSingleton类的示例;中间件在单例示例被递增之前已经访问了它。这就是为什么它返回0。

相关问题