typescript 如何防止Next.js多次示例化一个单例类/对象?

m1m5dgzv  于 2023-02-20  发布在  TypeScript
关注(0)|答案(1)|浏览(118)

我有一个分析实用程序,如下所示:

class Analytics {
    data: Record<string, IData>;

    constructor() {
        this.data = {};
    }
    setPaths(identifier: string) {
        if (!this.data[identifier])
            this.data[identifier] = {
                generic: getGenericInit(),
                session: getSessionInit(),
                paths: {
                    geoCollectionPath: '',
                    sessionCollectionPath: '',
                    eventsCollectionPath: ''
                }
            };
        this.data[identifier].paths = {
            geoCollectionPath: getGeoPath(identifier),
            sessionCollectionPath: getSessionPath(identifier),
            eventsCollectionPath: getEventPath(identifier)
        };
    }
    getAll() {
        return this.data;
    }
}

const analytics = new Analytics();
export default analytics;

我把它导入到2个api文件夹:e1.tse2.ts
e1.ts

import { NextApiHandler } from 'next';
import analytics from '@/firebase/v2/analytics';

const handler: NextApiHandler = (req, res) => {
    analytics.setPaths('abc');
    return res.status(201).end();
};
export default handler;

e2.ts

import { NextApiHandler } from 'next';
import analytics from '@/firebase/v2/analytics';

const handler: NextApiHandler = (req, res) => {
    return res.status(200).json(analytics.getAll());
};
export default handler;

现在,即使我通过点击/api/e1添加数据,因为导入在e2中示例化了一个新的类,我也无法从/api/e2中检索数据。
我也试过使用static示例,但是效果不太好。有人能帮我找到一个解决方案吗?

p8ekf7hl

p8ekf7hl1#

在这个由Next.js团队编写的article中,如果您深入到示例化PrismaClient的部分,为了不在开发中使用新示例,他们使用global对象,如下所示:

class Analytics {
  //...
}

let analytics: Analytics;

if (process.env.NODE_ENV === "production") {
  analytics = new Analytics();
} else {
  if (!global.analytics) {
    global.analytics = new Analytics();
  }
  analytics = global.analytics;
}

export default analytics;

相关问题