【问题标题】:Please fix the error: "TypeError: Cannot read property 'id' of undefined."请修复错误:“TypeError:无法读取未定义的属性 'id'。”
【发布时间】:2021-08-31 05:56:24
【问题描述】:

我正在尝试为朋友的服务器编写一个不和谐机器人。它应该是一个有趣的机器人,所以我认为添加垃圾邮件命令会很有趣。但是当我这样做时,我不断收到错误。有人可以帮我解决错误吗?代码和错误都在下面给出。

当我执行命令-spam @[user] 时它工作正常。但是当有人输入错误并且可能是-spam [random characters]时,它会向我显示错误

代码:

client.on("message", msg => {
  if(msg.content.startsWith(prefix+'spam ')){
    let mentions = msg.mentions.members.first().id;
    if(!mentions) return msg.reply("I'm sorry! That user does not exist.")
    for(var i=1;i<=5;i++) {
      msg.channel.send('<@'+mentions+'>')
    }
  }
})

错误是

TypeError: Cannot read property 'id' of undefined
    at Client.<anonymous> (/home/runner/VADER-Bot/index.js:44:44)
    at Client.emit (events.js:326:22)
    at Client.EventEmitter.emit (domain.js:483:12)
    at MessageCreateAction.handle (/home/runner/VADER-Bot/node_modules/discord.js/src/client/actions/MessageCreate.js:31:14)
    at Object.module.exports [as MESSAGE_CREATE] (/home/runner/VADER-Bot/node_modules/discord.js/src/client/websocket/handlers/MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (/home/runner/VADER-Bot/node_modules/discord.js/src/client/websocket/WebSocketManager.js:384:31)
    at WebSocketShard.onPacket (/home/runner/VADER-Bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (/home/runner/VADER-Bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:301:10)
    at WebSocket.onMessage (/home/runner/VADER-Bot/node_modules/ws/lib/event-target.js:132:16)
    at WebSocket.emit (events.js:314:20)
repl process died unexpectedly: exit status 1

【问题讨论】:

  • 真正的问题是什么?您的脚本中只有一个名为id 的属性实例。因此...msg.mentions.members.first() 返回undefined。发生这种情况时检查文档并相应地调整您的脚本。
  • 你自己已经提到了这个问题。 -spam @[user]-spam [random characters] + msg.mentions
  • @Andreas 你好。感谢您的回复,但我是一个整体编码新手。所以你能像我是个孩子一样跟我说话吗?谢谢:D

标签: javascript node.js discord.js


【解决方案1】:

您可以使用optional chaining (?.)。如果之前的值为nullish,它将返回 undefined 或 null。如果不是,则转到下一个属性(在这种情况下为id

let mentions = msg.mentions.members.first()?.id //notice the '?.'
if(!mentions) return msg.reply("I'm sorry! That user does not exist.")

如果没有提到任何人,这不会引发错误,并且会转到“对不起...”消息。

编辑:由于您的评论,您似乎使用的是旧版本的 node.js。这有点长,但应该可以解决问题。

const check = msg.mentions.members.first()
if(check) let mentions = check.id

【讨论】:

  • 这是修复它的最快方法,因为您需要添加单个字符 (?)
  • 嗨。我试过你说的。这也显示了一个错误,说Unexpected token '.'
  • 您使用的是什么版本的 node.js?见this
  • 我为旧版本的 node.js 编辑了答案
  • 原来我使用的是旧版本。非常感谢你的帮助!我真的很感激!
【解决方案2】:

msg.mentions.members.first() 函数返回未定义,尝试记录这个大对象的每个部分,看看你在哪里丢失了变量。

【讨论】:

  • 我是 JS 和 Coding 的新手,所以你能像我 12 岁一样跟我说话吗? :D
【解决方案3】:

msg.mentions.members.first() 未定义,这是意料之中的,因为他们输入了 -spam [不包含用户的内容]

尝试检查msg.mentions.members.first() 是否存在,如果存在则获取id。如果没有,请不要这样做,因为您会收到错误消息。

client.on("message", msg => {
  if(msg.content.startsWith(prefix+'spam ')){
    let mentions = msg.mentions.members.first();
    if(!mentions) return msg.reply("I'm sorry! That user does not exist.")
    for(var i=1;i<=5;i++) {
      msg.channel.send('<@'+mentions.id+'>')
    //etc
    }
  }
}

【讨论】:

  • 我是 JS 和 Coding 的新手,所以你能像我 12 岁一样跟我说话吗? :D
  • 你不明白哪一部分?如果您一无所知,就很难(而且要求很高)与您交谈。
【解决方案4】:

分别在let mentions = msg.mentions.members.first().id; 上调用函数first(),然后将id 分配给提及。首先确保msg.mentions.members中的每个对象都有定义。

const object1 = { a: 'cat', b: 123, c: true }。如果你想访问 b 的值,你可以输入const bValue = object1.b。所以以同样的方式,const object1 = { a: { b: 'Dog' } },要访问 a 的值,const aValue = object1.a.b 将是答案。因此,在您的情况下,您必须检查 msg 中是否有一个名为提及的对象和提及中的成员,以及对象成员中是否存在高度不链接的函数。首先检查let members = msg.mentions.members 是否存在。如果不是,你会再次得到 TypeError: Cannot read property 'members' of undefined。希望这已经足够清楚了。

【讨论】:

  • 我是 JS 和 Coding 的新手,所以你能像我 12 岁一样跟我说话吗? :D
  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
  • const object1 = { a: 'cat', b: 123, c: true }。如果你想访问 b 的值,你可以输入const bValue = object1.b。所以以同样的方式,const object1 = { a: { b: 'Dog' } },
【解决方案5】:

其他人也这么说过。但是您说您是编码新手,所以我将尝试详细说明。 你拥有的是这样的:

let mentions = msg.mentions.members.first().id;
if(!mentions) return msg.reply("I'm sorry! That user does not exist.")

它给你这个错误是因为你在获取用户 ID 之后检查用户是否存在,你应该首先检查他们是否存在。它无法设置对 ID 的提及,因为 msg.mentions.members.first() 返回未定义。

let mentions = msg.mentions.members.first(); // set mentions variable to the member object
if(!mentions) return msg.reply("I'm sorry! That user does not exist."); // check if user exists
mentions = mentions.id; // set mentions to the id of the mentioned user

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2019-08-19
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2021-10-03
    • 2021-10-28
    • 2022-12-24
    相关资源
    最近更新 更多