我有这样一个类: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;
但是,这也无法保留示例。
2条答案
按热度按时间pengsaosao1#
这里有一种方法,我们在Security类中定义一个静态方法getInstance,并调用它来获取其他文件中的Security示例
用法示例
这就是所谓的Singleton设计模式,你可以在Singleton design pattern阅读更多信息
dfuffjeb2#
显示的代码对我来说是有效的(两个文件的会话对象是相同的),但是,不清楚您想用代码实现什么。
在
file1.js
中,你有security.addSession("abc", "deg")
。在file2.js
中,你有security.getSession("abc", "def")
。(deg
与def
)。调用
security.addSession("abc", "deg")
后,this.activeSessions['abc']
的内容为:{ua : "deg"}
.当你调用
security.getSession("abc", "def")
时,你有一个测试if (ua !== currentSession.ua) return;
,它比较ua
和currentSession.ua
,currentSession.ua
是deg
,它们不相等,所以你返回undefined
。