Использование деструктурирования в операторе импорта

#javascript #discord.js

#javascript #discord.js

Вопрос:

У меня есть два файла — /utils/BroadcasterEmbed.js и /commands/broadcaster.js . BroadcasterEmbed.js Целью broadcaster.js является импорт в. Однако, когда я тестирую приведенный ниже код, я получаю следующую ошибку TypeError: BroadcasterEmbed is not a constructor

Я знаю, что это возможно, учитывая реализацию с открытым исходным кодом, с которой я столкнулся. Я что-то упускаю?

BroadcasterEmbed.js

 const { RichEmbed } = require('discord.js');

module.exports = class BroadcasterEmbed extends RichEmbed {
    constructor(data = {}) {
        super(data);
    }
}
  

broadcaster.js

 const { BroadcasterEmbed } = require('../')

exports.run = (client, message, args) => {
    ...

    message.channel.send(new BroadcasterEmbed().setDescription('hello'));

    ...
}
  

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

1. Класс находится на корневом уровне. Вам не нужно разрушать. Вы пытаетесь уничтожить класс сам по себе.

2. Вам также необходимо указать явное имя файла в инструкции require, поскольку имя файла, содержащего этот класс, не index.js .

Ответ №1:

Когда вы делаете

 module.exports = class BroadcasterEmbed extends RichEmbed {
  

Это означает, что весь модуль, когда require он используется, оценивает то, что находится на другой стороне = , то есть класса. Не пытайтесь деструктурировать, вместо этого просто требуйте простой класс:

 const BroadcasterEmbed = require('../')
  

Вы бы использовали деструктурирование, если бы назначили класс свойству исходного module.exports объекта, например:

 module.exports.BroadcasterEmbed = class...
  

и затем

 const { BroadcasterEmbed } = require('../')
  

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

1.Спасибо, похоже, это работает! Если вы не возражаете — есть ли причина, по которой это работает в следующем экземпляре? github.com/SwitchbladeBot/switchblade/blob/…github.com/SwitchbladeBot/switchblade/blob /…

2. Я не уверен в Discord, я никогда его не использовал, я не знаю, где RichEmbed определено в их источнике. Но для другой ссылки index.js file экспортирует объект, который { EventListener, SwitchbladeEmbed, Constants } , среди прочего, обладает этими 3 свойствами, поэтому деструктурирование работает.

3. Я полностью пропустил index.js . Это многое объясняет. Ваше объяснение было очень полезным! Спасибо!

Ответ №2:

Broadcaster.js должен иметь этот импорт statenent:

 const BroadcasterEmbed = require('../BroadcasterEmbed.js')
  

Класс находится на корневом уровне. Вам не нужно разрушать. Вы пытаетесь уничтожить класс сам по себе.

Вам также необходимо указать явное имя файла в инструкции require, поскольку имя файла, содержащего этот класс, не index.js является .