问题“ client.fetchUser”无法发送数据

时间:2019-09-06 01:35:42

标签: javascript node.js discord discord.js

一段时间以来,我一直在制作Discord Node.JS机器人,我正在使用“ unban”命令,但是我遇到的问题是两个问题,首先,即使他们未被禁止,它也会尝试禁止成员,第二个是最大的,client.fetchUser(toUnban)无法解析“ .username”和“ .avatarURL”之类的内容。

我已经尝试制作一个单独的系统来收集此数据(因为它起作用了),并且只能在函数中使用它。不在外面。

client.fetchUser(toUnban)
  .then(user => console.log(user.username))
  .then(user => usersname = user.username)
  .catch(console.error)
console.log(usersname)

将打印(例如)

Clichefoox

如果在此函数之外调用,它将不打印任何内容。如果在内部调用它将打印一些内容。问题是我正在尝试使其获得avatarURL AND用户名。因此,我不知道如何在一个RichEmbed中实现两者。

完整代码:

const Discord = require('discord.js')
exports.run = (client, message, args) => {
  if (!message.member.hasPermission("BAN_MEMBERS") || !message.author == message.guild.owner) return message.channel.send("You don't have access to this command. :x:")
  if (!message.guild.me.hasPermission("ADMINISTRATOR")) return message.channel.send(`${message.guild.owner} did not give me permission to do this! If you are the owner, please run this command \`${client.config.PREFIX}fixserver\`!`)
  let toUnban = args[0]
  if (!toUnban) return message.channel.send("You did not give a User ID!")
  if (toUnban.includes("@")) { return message.channel.send("That is not a User ID!") }
  let reason = args.slice(1).join(" ")
  if (!reason) reason = "No reason."
  var Embed = new Discord.RichEmbed()
    .setColor('#ebe234')
    .setTimestamp()
    .setDescription(`**${client.fetchUser(toUnban).username}** has been unbanned from the server!`)
    .setFooter(`V${client.config.VERSION} | ${toUnban}`, client.user.displayAvatarURL)
    .setAuthor("Unbanned", client.fetchUser(toUnban).avatarURL)
    .addField("User", message.author.tag, true)
    .addField("Reason", reason, true)
  var cEmbed = new Discord.RichEmbed()
    .setColor('#2b2b2b')
    .setTimestamp()
    .setDescription(`**${client.fetchUser(toUnban).username}** has been unbanend.`)
    .setAuthor("Unbanned", client.fetchUser(toUnban).avatarURL)
    .addField("Reason", reason)
  try {
    message.guild.unban(toUnban, reason)
  } catch(e) {
    return message.reply("This user isn't banned!")
  }
  message.channel.send({embed: cEmbed})
  try {
    var logChannel = message.guild.channels.find(c => c.name === "bot-logs")
    logChannel.send({embed: Embed})
  } catch(e) {
    message.guild.createChannel("bot-logs", {
      type: 'text',
      permissionOverwrites: [{
        id: message.guild.id,
        deny: ['READ_MESSAGES', 'SEND_MESSAGES']
      }]
    })
    setTimeout(function(){
      var logChannel = message.guild.channels.find(c => c.name === "bot-logs")
      logChannel.send({embed: Embed})
    }, client.ping*2.5)
  }
}

预期的结果是,它会根据Client#FetchUser来理解用户名,它会传递“ User”类,因此我尝试将其称为普通User类,但没有收到错误或输出,只是空白。

2 个答案:

答案 0 :(得分:2)

.then(user => console.log(user.username))告诉代码接受用户,打印user.username,然后返回console.log的返回值,该值未定义。

尝试

.then(user => {
  console.log(user.username);
  return user;
}

或更简洁地

.then(user => console.log(user.username) || user)

答案 1 :(得分:0)

为有此问题的其他人提供此答案,但是Client#fetchUser确实不值得使用。相反,我将使用

let user = client.users.get(toUnban);

为什么?-因为这不像Client#fetchUser那样麻烦。

client.user上的文档及其传递的内容:Client#Users,它传递了User类,该类可用于通过ID来获取用户,这就是我正在做的事情。也可以用于按名称搜索。

此外,在尝试取消禁止成员之前,我将用于检查成员是否被禁止的方法看起来像这样:

try {
  const banList = await message.guild.fetchBans();
  const bannedUser = banList.find(user => user.id === toUnban);
  if (!bannedUser) return message.channel.send("This user is not banned!");
} catch(e) {
  console.log(e);
};

Stackoverflow提供的代码示例

您需要将您的exports.run部分放入 async 中,因为它会唤醒 guild#fetchBans,因为它会返回有关Promise的有关异步/等待的更多信息可用的here,如下所示:

exports.run = async (client, message, args) => {
  // your code
};

这仅仅是比我在互联网上发现的更多的理解。