Discord.js Выборка узла городского словаря

#javascript #discord #discord.js

#javascript #Discord #discord.js

Вопрос:

Я пытаюсь создать команду городского словаря для своего бота, чтобы пользователи могли искать определенное слово или фразу

 (prefix)urban <args>
 

Я использую обработчик команд Commando, выборку узла и строку запроса. Ссылки находятся внизу.
Вот мой код:

 const commando = require('discord.js-commando')
const { MessageEmbed } = require('discord.js')
const fetch = require('node-fetch')
const queryString = require('query-string')

module.exports = class UrbanDictionaryCommand extends commando.Command {
    constructor(client) {
        super(client, {
            name: 'urbandictionary',
            aliases: ['urban'],
            group: 'misc',
            memberName: 'urbandictionary',
            description: 'Shows the urban dictionary entry for a word or phrase'
        })
    }

    async run(message, args) {
        if(!args) {
            message.reply('You need to specify something to search')
            return
        }

        const { list } = await fetch(`https://api.urbandictionary.com/v0/define?${args}`).then(response => response.json())

        try {
            const [answer] = list
            const trim = (str, max) => ((str.length > max) ? `${str.slice(0, max - 3)}...` : str)

            const embed = new MessageEmbed()
                embed.setTitle(answer.word)
                embed.setURL(answer.permalink)
                embed.addFields({
                    name: 'Definition',
                    value: trim(answer.definition, 1024),
                    inline: false
                }, {
                    name: 'Example',
                    value: trim(answer.example, 1024),
                    inline: false
                }, {
                    name: 'Rating',
                    value: `${answer.thumbs_up} 👍 || ${answer.thumbs_down} 👎`,
                    inline: false
                })
                embed.setFooter(`Command issued by ${message.author.tag}`, message.author.displayAvatarURL())
            message.channel.send(embed)
        } catch (error) {
            console.log(error)
            message.channel.send(`No results found for ${args}`)
            return
        }
    }
}
 

Когда я выполняю команду на своем сервере Discord, я получаю это сообщение об ошибке

 TypeError: list is not iterable
    at UrbanDictionaryCommand.run (C:UsersOwnerOneDriveDesktop(BotName)cmdsmiscurban.js:26:30)
 

Я не совсем уверен, в чем проблема с командой

Вот ссылки на npm для используемых функций:

 Node-Fetch: https://www.npmjs.com/package/node-fetch
Query-String: https://www.npmjs.com/package/query-string
 

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

1. Не могли бы вы попробовать console.log ging list , чтобы узнать, что это такое? Или, может быть, не разрушать его и регистрировать ответ?

Ответ №1:

При использовании .then() переменные внутри не возвращаются.

 const { list } = await fetch(`https://api.urbandictionary.com/v0/define?${args}`).then(response => response.json())
 

приведенный response.json() выше код является локальным, поэтому «список» не определен.

 const response = await fetch(`https://api.urbandictionary.com/v0/define?${args}`)
const {list} = await response.json()
 

И на совершенно несвязанной ноте, убедитесь, что эта команда ограничена только каналами NSFW, поскольку urban dictionary может возвращать данные NSFW, и это противоречит правилам discord для размещения этих данных в каналах, отличных от NSFW.

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

1. Я проверил это и .then фактически изменяет значение, возвращаемое как Promise . Точный фрагмент кода, который я использовал Promise.resolve({ abc: "def" }).then(value => value.abc) , и он действительно вернулся "def" .

Ответ №2:

Ваш код работает отлично , за исключением вызова API , которым должен быть URL — адрес …

 https://api.urbandictionary.com/v0/define?term=