TypeError: data.matchAll is not a function discord.js 13.6.0
TypeError: data.matchAll is not a function discord.js 13.6.0
这是我的代码
if (data.guild.plugins.partnerCounting.enabled) {
if (message.channel.id === data.guild.plugins.partnerCounting.channel) {
if (/(discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\/.+)/i.test(message.content)) {
const Messages = require("discord-messages"); // messagecountertest
const messagesSchema = require("../base/Messages")
let UserDataPartner = await messagesSchema.findOne({
userID: message.author.id,
guildID: message.guild.id
})
if (!UserDataPartner) {
Messages.createUser(message.author.id, message.guild.id)
}
const inviteLink = await message.content.match(new RegExp(`discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\.+`))
setTimeout(async () => {
// in this
---------> await client.fetchInvite(inviteLink) <---------
.then(async (invite) => {
if (data.guild.plugins.partnerCounting.ignored.includes(invite.guild.id)) {
return message.error("f. utility/partnercount:IGNORED_GUILD")
} else {
await Messages.appendMessage(message.author.id, message.guild.id, 1);
const user = await Messages.fetch(message.author.id, message.guild.id);
setTimeout(async () => {
const embed = new Discord.MessageEmbed()
.setAuthor({ name: `${message.author.tag} | ${message.author.id}`, iconURL: message.author.displayAvatarURL({ size: 512, dynamic: true, format: 'png' }) }).setDescription(message.translate("f. utility/partnercount:SETDESCRIPTION", {
guild: invite.guild.name,
amount: user.data.messages
}))
.setFooter({ text: message.translate("f. utility/partnercount:SETFOOTER") })
.setColor(this.client.config.embed.color)
return message.reply({ embeds: [embed] })
}, 100)
}
})
}, 100)
}
}
}
错误是
TypeError: data.matchAll is not a function
at Function.resolveCode (C:\Users\ALL\Desktop\Slodziak13vNew\node_modules\discord.js\src\util\DataResolver.js:37:17)
at Function.resolveInviteCode (C:\Users\ALL\Desktop\Slodziak13vNew\node_modules\discord.js\src\util\DataResolver.js:46:17)
at Slodziak.fetchInvite (C:\Users\ALL\Desktop\Slodziak13vNew\node_modules\discord.js\src\client\Client.js:306:31)
at Timeout._onTimeout (C:\Users\ALL\Desktop\Slodziak13vNew\events\messageCreate.js:196:21)
at listOnTimeout (node:internal/timers:557:17)
at processTimers (node:internal/timers:500:7)
代码适用于 discord.js 12(是的,在 d.js 12 中有效,但在 d.js 13 中无效)
顺便说一句,这是计数伙伴关系的代码(与 Aiyu 或 Luminous Nova 相同)
有人知道怎么解决吗?或以其他方式编写,以便机器人可以读取消息中的邀请信息,例如guild.id
我尝试用 fetchInvites 或 invites.fetch 替换 fetchInvite,但没用
您可能需要检查 inviteLink
的值是多少。 fetchInvite()
期望它是一些 String
,但它不是 String
,导致发生此错误(字符串上有方法 .matchAll()
,所以此错误发生是因为 inviteLink
不是字符串)。将其记录到控制台并亲自查看。它可能是 undefined
或 Array
.
此特定错误不是 djs v12 与 v13 的问题。这是您使用 .match()
的问题。一起来看看吧:
const inviteLink = await message.content.match(new RegExp(`discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\.+`))
请注意,您的正则表达式定义了一个组(组是通过括号定义的,因此您的第一个也是唯一一个组是 (gg|io|me|li)
)。当在 String#match()
的正则表达式中定义组时,它 return 是一个 Array
而不是单个 String
。 returned Array
采用这种格式:
[
"full match",
"group 1 match",
"group 2 match",
...
]
无论您在 String
中找到多少您定义的组,它都会执行此操作。您只定义了一个组,因此 inviteLink
的长度为 2。例如,对于 discord.gg/abc123
邀请,它将看起来像这样:
[
"discord.gg/abc123",
"gg"
]
如您所见,您只需要 Array
中的第一项,因为它代表完整的邀请 URL。这就是您需要传递给 fetchInvite()
而不是整个 Array
的内容。你可以这样做:
const inviteLink = message.content.match(/discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\.+/)?.[0];
我在这里使用了可选的链接运算符,所以只要匹配不是 undefined
,它就会得到 Array
中的第一项(否则它只会 return undefined
).请注意,我还通过使用正则表达式语法而不是 RegExp
对象稍微简化了您的正则表达式;这可能有助于避免没有 double-escaping 反斜杠的问题。
这是我的代码
if (data.guild.plugins.partnerCounting.enabled) {
if (message.channel.id === data.guild.plugins.partnerCounting.channel) {
if (/(discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\/.+)/i.test(message.content)) {
const Messages = require("discord-messages"); // messagecountertest
const messagesSchema = require("../base/Messages")
let UserDataPartner = await messagesSchema.findOne({
userID: message.author.id,
guildID: message.guild.id
})
if (!UserDataPartner) {
Messages.createUser(message.author.id, message.guild.id)
}
const inviteLink = await message.content.match(new RegExp(`discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\.+`))
setTimeout(async () => {
// in this
---------> await client.fetchInvite(inviteLink) <---------
.then(async (invite) => {
if (data.guild.plugins.partnerCounting.ignored.includes(invite.guild.id)) {
return message.error("f. utility/partnercount:IGNORED_GUILD")
} else {
await Messages.appendMessage(message.author.id, message.guild.id, 1);
const user = await Messages.fetch(message.author.id, message.guild.id);
setTimeout(async () => {
const embed = new Discord.MessageEmbed()
.setAuthor({ name: `${message.author.tag} | ${message.author.id}`, iconURL: message.author.displayAvatarURL({ size: 512, dynamic: true, format: 'png' }) }).setDescription(message.translate("f. utility/partnercount:SETDESCRIPTION", {
guild: invite.guild.name,
amount: user.data.messages
}))
.setFooter({ text: message.translate("f. utility/partnercount:SETFOOTER") })
.setColor(this.client.config.embed.color)
return message.reply({ embeds: [embed] })
}, 100)
}
})
}, 100)
}
}
}
错误是
TypeError: data.matchAll is not a function
at Function.resolveCode (C:\Users\ALL\Desktop\Slodziak13vNew\node_modules\discord.js\src\util\DataResolver.js:37:17)
at Function.resolveInviteCode (C:\Users\ALL\Desktop\Slodziak13vNew\node_modules\discord.js\src\util\DataResolver.js:46:17)
at Slodziak.fetchInvite (C:\Users\ALL\Desktop\Slodziak13vNew\node_modules\discord.js\src\client\Client.js:306:31)
at Timeout._onTimeout (C:\Users\ALL\Desktop\Slodziak13vNew\events\messageCreate.js:196:21)
at listOnTimeout (node:internal/timers:557:17)
at processTimers (node:internal/timers:500:7)
代码适用于 discord.js 12(是的,在 d.js 12 中有效,但在 d.js 13 中无效)
顺便说一句,这是计数伙伴关系的代码(与 Aiyu 或 Luminous Nova 相同)
有人知道怎么解决吗?或以其他方式编写,以便机器人可以读取消息中的邀请信息,例如guild.id
我尝试用 fetchInvites 或 invites.fetch 替换 fetchInvite,但没用
您可能需要检查 inviteLink
的值是多少。 fetchInvite()
期望它是一些 String
,但它不是 String
,导致发生此错误(字符串上有方法 .matchAll()
,所以此错误发生是因为 inviteLink
不是字符串)。将其记录到控制台并亲自查看。它可能是 undefined
或 Array
.
此特定错误不是 djs v12 与 v13 的问题。这是您使用 .match()
的问题。一起来看看吧:
const inviteLink = await message.content.match(new RegExp(`discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\.+`))
请注意,您的正则表达式定义了一个组(组是通过括号定义的,因此您的第一个也是唯一一个组是 (gg|io|me|li)
)。当在 String#match()
的正则表达式中定义组时,它 return 是一个 Array
而不是单个 String
。 returned Array
采用这种格式:
[
"full match",
"group 1 match",
"group 2 match",
...
]
无论您在 String
中找到多少您定义的组,它都会执行此操作。您只定义了一个组,因此 inviteLink
的长度为 2。例如,对于 discord.gg/abc123
邀请,它将看起来像这样:
[
"discord.gg/abc123",
"gg"
]
如您所见,您只需要 Array
中的第一项,因为它代表完整的邀请 URL。这就是您需要传递给 fetchInvite()
而不是整个 Array
的内容。你可以这样做:
const inviteLink = message.content.match(/discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\.+/)?.[0];
我在这里使用了可选的链接运算符,所以只要匹配不是 undefined
,它就会得到 Array
中的第一项(否则它只会 return undefined
).请注意,我还通过使用正则表达式语法而不是 RegExp
对象稍微简化了您的正则表达式;这可能有助于避免没有 double-escaping 反斜杠的问题。