簡體   English   中英

跨 TypeScript 和 NextJs 中的文件的多個 singleton 實例

[英]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 的另一個實例,但是,在該文件中創建它之后再次正常工作。

我的問題是我不希望每個文件都有一個實例,而是希望整個應用程序都有一個實例。

DiscordClient.ts:

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 注冊的機器人應用程序的唯一令牌的占位符。

/pages/api/test1.ts

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);
}

/pages/api/test2.ts

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM