我升级到Discord.js v12,但它破坏了我现有的v11代码。以下是一些会导致错误的示例:
 // TypeError: client.users.get is not a function
const user = client.users.get('123456789012345678')

// TypeError: message.guild.roles.find is not a function
const role = message.guild.roles.find(r => r.name === 'Admin')

// TypeError: message.member.addRole is not a function
await message.member.addRole(role)

// TypeError: message.guild.createChannel is not a function
await message.guild.createChannel('welcome')

// TypeError: message.channel.fetchMessages is not a function
const messages = await message.channel.fetchMessages()

const {RichEmbed} = require('discord.js')
// TypeError: RichEmbed is not a constructor
const embed = new RichEmbed()

const connection = await message.channel.join()
// TypeError: connection.playFile is not a function
const dispatcher = connection.playFile('./music.mp3')
 

如何将代码迁移到Discord.js v12并进行修复错误?在哪里可以看到v12引入的重大更改?

#1 楼

这是人们在Discord.js v12中引入的一些最常见的重大更改。要访问此集合,请使用Client#users属性:
 Guild#roles 

此外,诸如Collectioncacheconst user = client.users.cache.get('123456789012345678') const role = message.guild.roles.cache.find(r => r.name === 'Admin') 之类的方法已移动给各自的经理:
 GuildMember#addRole 

Guild#createChannel
TextBasedChannel#fetchMessages类(例如await message.member.roles.add(role) await message.guild.channels.create('welcome') const messages = await message.channel.messages.fetch() Collection)现在仅接受函数,不是Collectionclient.users.cache的属性键和值:
 guild.roles.cache 

.find.findKey// v11: collection.find('property', 'value') collection.find(item => item.property === 'value') .exists也已删除:
 .deleteAll 

.filterArray现在在集合上而不是集合中的每个项目上运行一个函数:
 .findAll 


// v11: collection.exists('property', 'value') collection.some(item => item.property === 'value') // v11: collection.deleteAll() Promise.all(collection.map(item => item.delete())) // v11: collection.filterArray(fn) collection.filter(fn).array() // v11: collection.findAll('property', value') collection.filter(item => item.property === 'value').array() / .tap

// v11: collection.tap(item => console.log(item)) collection.each(item => console.log(item)) // New .tap behaviour: collection.tap(coll => console.log(`${coll.size} items`)) 类已被删除;使用现在用于所有嵌入(而不是仅接收的嵌入)的RichEmbed类。
 MessageEmbed 

RichEmbed方法具有也被删除了。此方法只是添加了一个零宽度空格(MessageEmbed)作为名称和值的字段,因此要添加空白字段,请执行以下操作:
 const {MessageEmbed} = require('discord.js')
const embed = new MessageEmbed()
 

语音
所有addBlankField / \u200B方法都已统一在单个embed.addField('\u200B', '\u200B') 方法下:
 VoiceConnection 

VoiceBroadcast#play***已移至play
 const dispatcher = connection.play('./music.mp3')
 

此外,Client#createVoiceBroadcast扩展了Node.js的ClientVoiceManager,因此请使用const broadcast = client.voice.createVoiceBroadcast() 而不是StreamDispatcherstream.Writable事件已被删除,以支持本机dispatcher.destroy()事件。
图像URL
诸如dispatcher.end()end之类的属性现在是方法:
 finish 

您还可以传递User#displayAvatarURL来自定义格式和大小等内容。
更多信息
要了解有关v12重大更改的更多信息,请查看更新指南和变更日志。该文档也是查找特定方法/属性的好资源。