node.js - 无法读取未定义的属性“名称”,而“名称”甚至不在代码中
问题描述
这最近才开始发生,不确定是否是 node 或 discord.js 或其他东西的错误,但我找不到任何会导致我的代码出现问题的东西。
有问题的程序是我制作的不和谐机器人程序。该错误仅在一个命令期间发生,该命令向上述用户发送一条消息并将一些信息存储在日志中以供以后使用。相关代码:
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 是“公会”中的 l channel.guild.name
。我不知道为什么当这段代码当时甚至没有运行时它会指向我这里。我将console.log
s 放在正在运行的函数中,以尝试确切地查看导致错误的行,但是所有正确的事情都记录下来,然后引发错误。最重要的是,它只被.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
您尝试 log 时channel.guild.name
,您会收到错误消息。
在最新版本的 Javascript 中,这就是可选链接运算符 ?.
的用途。在早期版本中,您只需channel.guild
在访问channel.guild.name
.
推荐阅读
- python - PyQt5 如何将不同的 QStyles 应用于不同的小部件?
- azure - Azure Devops 发布管道 - 将单个文件部署到 Azure 应用服务
- javascript - 5 秒后更改活动类(如果用户将鼠标悬停在项目上,则防止更改)
- javascript - jquery的ajax调用中未定义的变量
- c++ - 运行时检查失败 #2 - 变量“c2d”周围的堆栈已损坏。用 C++
- flutter - 如何在父容器之外制作容器
- active-directory - 如何从已部署在 WebSphere Application Server 中的应用程序生成 LTPA 令牌
- java - Java运行3个线程并显示ID
- asp.net - 为什么 TextBox 在 ajax 调用时自动为空
- excel - Excel,对齐重复项+其他数据