如何将我的代码从v11迁移到Discord.js v12?

时间:2020-09-16 00:05:38

标签: javascript discord discord.js

我升级到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 个答案:

答案 0 :(得分:9)

这是人们在Discord.js v12中引入的一些最常见的重大更改。

经理

Client#usersGuild#roles之类的属性现在是 managers (经理),而不是已缓存的Collection个项目。要访问此集合,请使用cache属性:

const user = client.users.cache.get('123456789012345678')
const role = message.guild.roles.cache.find(r => r.name === 'Admin')

此外,诸如GuildMember#addRoleGuild#createChannelTextBasedChannel#fetchMessages之类的方法已移至各自的管理器:

await message.member.roles.add(role)
await message.guild.channels.create('welcome')
const messages = await message.channel.messages.fetch()

Collection

Collection类(例如client.users.cacheguild.roles.cache)现在仅接受{strong>功能,而不接受.find和{ {1}}:

.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类已被删除;请使用 MessageEmbed 类,该类现在用于所有嵌入(而不是仅接收到的嵌入)。

RichEmbed

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

\u200B

声音

所有embed.addField('\u200B', '\u200B') / VoiceConnection方法已统一在一个 play 方法下:

VoiceBroadcast#play***

const dispatcher = connection.play('./music.mp3') 已移至ClientVoiceManager

Client#createVoiceBroadcast

此外,const broadcast = client.voice.createVoiceBroadcast() 扩展了Node.js的stream.Writable,因此请使用StreamDispatcher而不是dispatcher.destroy()dispatcher.end()事件已被删除,以支持本机end事件。

图片网址

finishUser#displayAvatarURL之类的属性现在为方法

Guild#iconURL

您还可以传递ImageURLOptions来自定义格式和大小之类的内容。

更多信息

要了解有关v12重大更改的更多信息,请查看the updating guidechangelogdocumentation还是查找特定方法/属性的好资源。