无法读取未定义的 属性 "name" 而 "name" 甚至不在代码中

Cannot read property "name" of undefined while "name" isn't even in the code

这是最近才开始发生的,不确定是节点错误还是 discord.js 或其他问题,但我找不到任何会导致我的代码出现问题的问题。

有问题的程序是我制作的一个discord bot的程序。该错误仅在一个命令期间发生,该命令向提到的用户发送一条消息并将一些信息存储在日志中以备后用。相关代码:

if (!rating) {
    let index = Math.floor(Math.random() * PARANOIAQUESTIONS["pg13"].length)
    message.mentions.users.first().send("Question from " + message.author.username + ": \n" + PARANOIAQUESTIONS["pg13"][index] + "\nReply with '+ans [answer]'.").catch((err) => {message.channel.send("That user has their DMs set to closed."); console.log(err)})
    paranoiaLog[message.mentions.users.first()] = message.channel
    askedQuestions[message.mentions.users.first()] = PARANOIAQUESTIONS["pg13"][index]
} else {
    let index = Math.floor(Math.random() * PARANOIAQUESTIONS["r"].length)
    message.mentions.users.first().send("Question from " + message.author.username + ": \n" + PARANOIAQUESTIONS["r"][index] + "\nReply with '+ans [answer]'.").catch((err) => {message.channel.send("That user has their DMs set to closed."); console.log(err)})
    paranoiaLog[message.mentions.users.first()] = message.channel
    askedQuestions[message.mentions.users.first()] = PARANOIAQUESTIONS["r"][index]
}

此代码段(略有不同)在整个函数中重复多次,具体取决于发送命令的服务器和通道的特定权限。错误可能发生在任何这些重复中,所以我不要认为这是一个奇怪的错字(而且它才刚刚开始发生)。奇怪的是:错误消息将我指向 49:94,而这段代码位于第 1100 行左右。第 48-52 行:

client.on('channelCreate', (channel) => {
    console.log("Channel created: " + channel.name + ", " + channel.id + " in " + channel.guild.name + " (" + channel.guild.systemChannelID + ")")
    serverSettingsList[channel.guild.systemChannelID][channel.id] = {"muted?": 0, "truth pg": 1, "truth pg13": 1, "truth r": 0, "dare pg": 1, "dare pg13": 1, "dare r": 0, "dare d": 1, "dare irl": 1, "wyr pg": 1, "wyr pg13": 1, "wyr r": 0, "nhie pg": 1, "nhie pg13": 1, "nhie r": 0, "paranoia pg":1, "paranoia pg13": 1, "paranoia r": 0}
    fs.writeFileSync('serversettingslist.json', JSON.stringify(serverSettingsList, null, '\t'))
})

字符 94 是 channel.guild.name 中 "guild" 中的 l。我不知道为什么当这段代码当时甚至还没有 运行 时它会把我指向这里。我把 console.logs 放在 运行 的整个函数中,试着看看到底是哪一行导致了错误,但是所有正确的事情都会记录下来, 然后 错误抛出。最重要的是,只有一半的时间被 .catch 语句捕获,所以我真的不知道它是什么。

编辑:正如其他人所注意到的,问题原来是 channel.guild 没有为 DM 频道定义。当它向我发送消息时,我曾假设 channelCreate 代码不会是 运行,因为自从我开始制作它以来,我已经打开了一个 DM,但忘记了 channel对象不仅限于服务器,也适用于 DM 和群组 DM。感谢您帮助我认识到我的错误!

在这行代码中:

console.log("Channel created: " + channel.name + ", " + channel.id + " in " + channel.guild.name + " (" + channel.guild.systemChannelID + ")")

您多次引用 .name。根据错误中的列号,channel.guild 似乎是 undefined,因此当您尝试记录 channel.guild.name 时,您会收到错误。

在最新版本的 Javascript 中,这就是 optional chaining operator ?. 的用武之地。在早期版本中,您只需在访问 channel.guild.name.

之前检查 channel.guild 是否有效