我的机器人保存了聊天记录,在有人向该机器人发送dms之前,它可以完美运行。这是记录消息的代码。
console.log(message.author.username, "||", message.channel.name, "-", message.content);
let channel = message.channel.name;
var readmessagefile = fs.readFileSync('./txt-files/logs.txt', 'utf-8');
var writemessagefile = fs.writeFileSync('./txt-files/logs.txt', 'Time - ' +
message.createdAt + ' Channel: ' + channel + " ||" + ' User - ' + message.member.user.username + ': ' +
message.content + "\n" + readmessagefile);
我正在尝试找到一种完全忽略dms的方法,这样它就不会弄乱任何东西。
这是错误:
C:\Documents\Projects\DiscordBot\commands\logs.js:11
message.createdAt + ' Channel: ' + channel + " ||" + ' User - ' + message.member.user.username + ': ' +
^
TypeError: Cannot read property 'user' of null
答案 0 :(得分:1)
您没有在对象成员中初始化用户字段(这是一个Null),它是var消息中的一个字段
答案 1 :(得分:0)
根据message.member
文档:
以公会成员的身份代表邮件的作者。仅当消息来自作者仍为行会的行会时可用
问题在于DM不在公会中发送,因此message.member
返回null
。您应该使用message.author
,它也具有username
属性,并且在全球范围内可用。
message.member.user
和message.author
从技术上讲返回相同的内容。 message.author
是创作消息的人的User对象。 message.member
是创作消息的人的GuildMember对象。 GuildMember.user
是GuildMember的User对象。
他们俩都返回相同的东西,但是要采取另外的步骤。
Author >> User (message.author)
Author >> GuildMember >> User (message.member.user)
此外,您可以使用template literals
来提高代码的可读性var writemessagefile = fs.writeFileSync(
'./txt-files/logs.txt',
`Time - ${message.createdAt} Channel: ${channel} || User - ${message.author.username}: ${message.author.content}\n${readmessagefile}`
);