在两个不同的文件中导入时防止类示例的复制- JavaScript?

cnh2zyt3  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(94)

我有这样一个类:Code Sandbox(在沙箱中,我导入了file 1,以便首先执行该部分代码,然后尝试使用file 2访问相同的文件,但它返回undefined)

import crypto from 'crypto';
const deleteMillis = 3600 * 1000;
class Security {
    activeSessions: Record<string, { ua: string }>;
    constructor() {
        this.activeSessions = {};
    }
    getSession(session: string, ua: string): { ua: string } | undefined {
        const currentSession = this.activeSessions[session];
        console.log(this.activeSessions, this.activeSessions[session], session);
        if (!currentSession) return;
        if (ua !== currentSession.ua) return;
        return currentSession;
    }
    addSession(ua: string): string {
        const session = crypto.randomUUID();
        this.activeSessions[session] = {
            ua
        };
        setTimeout(() => {
            this.removeSession(session);
        }, deleteMillis);
        return session;
    }
    removeSession(session: string) {
        delete this.activeSessions[session];
    }
}

const security = new Security();
export default security;

我想在多个es模块文件中使用这个类的security示例。比如说file1.js和file2.js。
现在的问题是,当我做一个导入:
从“@/security”导入安全性;// file-1从“@/security”导入安全性;//文件-2
上述方法的问题在于,两个文件中的数据不会保持同步,而且它们是独立操作的。
这两个文件创建了两个不同的示例,但是我想在两个文件中使用一个示例。2我怎样才能达到相同的效果呢?3我需要创建第三个文件吗?4或者确切的方法应该是什么?
正如答复中所建议的那样,我尝试了以下做法:

class Security {
    activeSessions: Record<string, { ua: string }>;
    private static instance: Security;
    constructor() {
        this.activeSessions = {};
    }
    getSession(session: string, ua: string): { ua: string } | undefined {
        const currentSession = this.activeSessions[session];
        console.log(this.activeSessions, this.activeSessions[session], session);
        if (!currentSession) return;
        if (ua !== currentSession.ua) return;
        return currentSession;
    }
    addSession(ua: string): string {
        const session = crypto.randomUUID();
        this.activeSessions[session] = {
            ua
        };
        setTimeout(() => {
            this.removeSession(session);
        }, deleteMillis);
        return session;
    }
    removeSession(session: string) {
        delete this.activeSessions[session];
    }
    static getInstance(): Security {
        if (!Security.instance) {
            Security.instance = new Security();
        }
        console.log('Security instance', Security.instance);
        return Security.instance;
    }
}

const security = Security.getInstance();
export default security;

但是,这也无法保留示例。

pengsaosao

pengsaosao1#

这里有一种方法,我们在Security类中定义一个静态方法getInstance,并调用它来获取其他文件中的Security示例

class Security {
    private static instance: Security;
    
    // other methods and variables

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

export default Security;

用法示例

let securityInstance = Security.getInstance();
securityInstance.getSession();

这就是所谓的Singleton设计模式,你可以在Singleton design pattern阅读更多信息

dfuffjeb

dfuffjeb2#

显示的代码对我来说是有效的(两个文件的会话对象是相同的),但是,不清楚您想用代码实现什么。
file1.js中,你有security.addSession("abc", "deg")。在file2.js中,你有security.getSession("abc", "def")。(degdef)。
调用security.addSession("abc", "deg")后,this.activeSessions['abc']的内容为:{ua : "deg"} .
当你调用security.getSession("abc", "def")时,你有一个测试if (ua !== currentSession.ua) return;,它比较uacurrentSession.uacurrentSession.uadeg,它们不相等,所以你返回undefined

相关问题