此问题已在此处有答案:
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();
}
有人能解释一下为什么中间件中的单例示例不同吗?
1条答案
按热度按时间j2cgzkjk1#
中间件可以在API路由之前执行。这意味着API尚未递增CounterSingleton类的示例;中间件在单例示例被递增之前已经访问了它。这就是为什么它返回0。