как ссылаться на коллекцию валют из модуля в nodejs

#javascript #node.js #discord.js

#javascript #node.js #discord.js

Вопрос:

Я пытаюсь создать бот для экономии discord с помощью node.js и я пытаюсь переместить команды в модули, чтобы у меня был общий / динамический обработчик команд. Как мне ссылаться на коллекцию валют и модели, которые я создал в основном файле в командных модулях?


index.js файл:

 const currency = new Discord.Collection();


//defining methods for the currency collection
Reflect.defineProperty(currency, 'add', {
    /* eslint-disable-next-line func-name-matching */
    value: async function add(id, amount) {
        const user = currency.get(id);
        if (user) {
            user.balance  = Number(amount);
            return user.save();
        }
        const newUser = await Users.create({ user_id: id, balance: amount });
        currency.set(id, newUser);
        return newUser;
    },
});

Reflect.defineProperty(currency, 'getBalance', {
    /* eslint-disable-next-line func-name-matching */
    value: function getBalance(id) {
        const user = currency.get(id);
        return user ? user.balance : 0;
    },
});
  

(Во вложенной папке) balance.js :

 module.exports = {
    name: 'balance',
    description: 'get balance',
    execute(message, args) {

    const target = message.mentions.users.first() || message.author;
    return message.channel.send(`${target.tag} has ${currency.getBalance(target.id)}🍉`);

    },
};
  

Который в настоящее время выдает ошибку в валюте, поскольку она не определена. Однако я не знаю, как ссылаться на коллекцию валют, которую я создал в index.js , для которой также созданы методы.

Заранее благодарю вас.

Ответ №1:

Для этого вы могли бы прикрепить Collection к своему Client . Что-то вроде

 Client.currency = new Discord.Collection()
  

Каждый раз, когда вы затем ссылаетесь на коллекцию, вместо того, чтобы делать, currency вы бы затем запускали Client.currency .

Что касается доступа к объекту валюты через файлы, я бы добавил еще один параметр к вашему execute методу, что-то вроде этого:

 module.exports = {
    name: 'balance',
    description: 'get balance',
    execute(client, message, args) { // Notice the added "client"

    const target = message.mentions.users.first() || message.author;
    return message.channel.send(`${target.tag} has ${client.currency.getBalance(target.id)}🍉`); // Added "client." in front of "currency", because currency is a property of your client now

    },
};
  

Затем, при выполнении execute метода, вы должны выполнить execute(Client, message, arguments); . Затем ваш клиент будет передан в команду и будет использоваться там.

Комментарии:

1. Похоже, это не работает. Я попытался добавить Client.currency = new Discord.Collection() , и это выдает мне ошибку, указывающую, что клиент не определен. Я подумал, что, возможно, вы хотели добавить ее в существующую клиентскую версию, которая у меня есть const client = new Discord.Client(); , но затем она выдает мне сообщение об ошибке, в котором говорится, что валюта не определена.

2. @fl384 Когда я говорил о Client , я, конечно, улучшил ваш экземпляр клиента. Поскольку вы не сказали, как она была названа, я просто использовал Client в качестве заполнителя.

3. Я пробовал это изначально, но теперь понимаю, что неправильно понял ошибку, которую он выдал. Это работает, спасибо!