UnhandledPromiseRejectionWarning: TypeError [INVALID_TYPE]: предоставленные параметры не являются объектом - PullRequest
0 голосов
/ 26 апреля 2020

Я создаю бот-диск с Discord. JS, но когда я пытаюсь выполнить команду, она показывает мне эту ошибку:

(node:4) UnhandledPromiseRejectionWarning: TypeError [INVALID_TYPE]: Supplied options is not an object. at Message.delete (/app/node_modules/discord.js/src/structures/Message.js:501:44) at /app/commands/warn.js:3:89.

Предупреждение. js код:

module.exports.run = async (bot, message, args) => {
    let target = message.mentions.members.first()
    if(!target) return message.channel.send("Couldn't find that ID!").then(m => m.delete(15000))

    let reason = args.slice(1).join(" ")
    if(!reason) return message.channel.send(`Please give a reason to warn **${target.user.tag}**!`).then(m => m.delete(15000))

    message.channel.send(`Warned **${target.user.tag}**!`).then(m => m.delete(15000))
    // get role by name
let myRole = message.guild.roles.cache.find(role => role.name === "Warned");
target.addRole(role).catch(console.error);

}

module.exports.help = {
    name: "warn",
    aliases: []
}

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

В javascript есть несколько способов обработки асинхронного кода.

В вашем примере вы используете функцию async. Это означает, что вы можете использовать async / await - эта функция построена поверх Promise с синтаксическим сахаром.
Она позволяет вам писать свой код "синхронно". Поэтому вы можете переписать свой вызов Promise следующим образом:


module.exports.run = async (bot, message, args) => {
    let target = message.mentions.members.first()
    if(!target) {
      const message = await message.channel.send("Couldn't find that ID!"); 
      return message.delete(15000)
    }

Также ошибка UnhandledPromiseRejectionWarning предупреждает вас о том, что у вас есть ошибка при выполнении Promise. Здесь параметр, переданный функции delete, имеет неправильный тип. Ожидается объект, но номер получен. Вот документация API сообщения .

Чтобы go сделать шаг вперед, вы можете справиться с отклонением Promises с помощью функции .catch цепочки, это может быть полезно для отладки или зарегистрируйте ошибку.

// Promises style
let target = message.mentions.members.first()

if(!target) {
  return message.channel.send("Couldn't find that ID!")
  .then(m => m.delete(15000))
  .catch(error => console.log(error))
}

Или используйте синтаксис async / await:

// async/await style
let target = message.mentions.members.first()

if(!target) {
  try {
    const message = await message.channel.send("Couldn't find that ID!"); 
    return message.delete(15000)
  } catch(error) {
    console.log(error)
  }
}
0 голосов
/ 27 апреля 2020

Функция удаления ожидает объект для своего параметра, и вы можете указать тайм-аут в этом.

    if(!reason) return message.channel.send(`Please give a reason to warn **${target.user.tag}**!`).then(m => m.delete({timeout: 15000}))
...