[英]Multiple singleton instances across files in TypeScript and NextJs
Recently, I have been working on a personal project involving the creation of some API endpoints using NextJs and TypeScript that call back on the Discord API using discord.js. 如果您從未接觸過 discord API,請不要害怕它,我不認為該庫是問題所在,因此為什么它不包含在線程標題中。
我已經為 discord.js API 客戶端實現了 singleton,因為客戶端可能需要大約一兩秒來登錄和初始化,時間我不想添加到每個響應中。 這在一個文件/端點上效果很好,一旦該文件具有實例,它就會保留它。 但是,一旦我加載另一個文件/端點,它就會創建 singleton 的另一個實例,但是,在該文件中創建它之后再次正常工作。
我的問題是我不希望每個文件都有一個實例,而是希望整個應用程序都有一個實例。
import { Client } from 'discord.js';
class DiscordClient {
private static discordClient: DiscordClient;
public APIClient: Client;
private constructor() {
this.APIClient = new Client();
this.APIClient.login($TOKEN);
}
public static get Instance() {
if (!this.discordClient) {
this.discordClient = new DiscordClient();
}
return this.discordClient;
}
}
export const DiscordClientInstance = DiscordClient.Instance;
注意: token 只是我在 discord 注冊的機器人應用程序的唯一令牌的占位符。
import { DiscordClientInstance } from "../../DiscordClient";
export default (req, res) => {
let guild = DiscordClientInstance.APIClient.guilds.fetch($GUILD_1_ID)
.then(guild => {
console.log(guild.name);
res.statusCode = 200;
res.json({ name: guild.name });
})
.catch(console.error);
}
import { DiscordClientInstance } from "../../DiscordClient";
export default (req, res) => {
let guild = DiscordClientInstance.APIClient.guilds.fetch($GUILD_2_ID)
.then(guild => {
console.log(guild.name);
res.statusCode = 200;
res.json({ name: guild.name });
})
.catch(console.error);
}
注意: $GUILD_#_ID 只是一個占位符,用於表示我正在獲取的 discord 服務器的 ID 將 go。
如上所示,test1.ts 和 test2.ts 幾乎相同,並且繼承了相同的 const。
如果有人對為什么會發生這種情況有任何線索,我將不勝感激。 我深夜谷歌搜索的其他網站上的一些人認為這可能是節點的問題,但是,老實說,我不知道。
謝謝,馬特:)
我使用這種模式沒有問題 - 你在生產模式下試過嗎? 在開發模式下,Next.js 將按需編譯每個頁面,我觀察到這打破了這種模式。 本質上,如果您看到“正在編譯...”,那么您就失去了堅持。 在生產模式下,這不會發生,您應該會看到您的單個實例持續存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.