#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
ginglist
, чтобы узнать, что это такое? Или, может быть, не разрушать его и регистрировать ответ?
Ответ №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=