TypeError [ERR_INVALID_ARG_TYPE]:“ url”参数必须为字符串类型。收到Array的实例

时间:2020-07-31 07:45:05

标签: discord.js

我正在使用discord.js和ytdl-core编写音乐Discord机器人,我不知道如何解决此错误。

Error: (node:14720) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. Received an instance of Array

我的机器人的所有代码都在这里:

const Discord = require('discord.js')
let bot = new Discord.Client()
const ytdl = require('ytdl-core')

bot.on('ready',() => {
    console.log(`bot ${bot.user.username} online!`)
})

bot.on('message', message => {
    const queue = new Map()
    let embedRed = '#ff0000'
    let embedGreen = '#1eff00'
    let messageArray = message.content.split(" ")
    let command = messageArray[0]
    let args = messageArray.slice(1)
    if(command == '!!play') {
        let song = args, voice = message.member.voice.channel
        let connection = voice.join()
        if (!song) {
            message.react("❌")
            let embed = new Discord.MessageEmbed()
                .setAuthor("Error!")
                .addField("Input URL adress of music")
                .setColor(embedRed)
            message.channel.send(embed)
            return
        }
        if (!voice) {
            message.react("❌")
            let embed = new Discord.MessageEmbed()
                .setAuthor("Error!")
                .addField("Join voice channel!")
                .setColor(embedRed)
            message.channel.send(embed)
        }
        let valid = ytdl.validateURL(song)
        if (!valid) {
            message.react("❌")
            let embed = new Discord.MessageEmbed()
            .setAuthor("Error!")
            .addField("Your URL adress is not valid")
            .setColor(embedRed)
        message.channel.send(embed)
        }
        let guild_queue = queue.get(message.guild.id)
        if (!guild_queue) guild_queue = queue.set(message.guild.id, {songs: []}).get(message.guild.id)

        guild_queue.songs.push(song)
        message.react("✅")
        let embed = new Discord.MessageEmbed()
            .setAuthor("Music")
            .addField("Track added to queue")
            .setColor(embedGreen)
        message.channel.send(embed)
        if (guild_queue.songs.length < 2) play(connection, guild_queue.songs)  
    }
    async function play(connection, songs) {
        const music = ytdl(songs[0], {filter: 'audioonly', quality: 'highestaudio'})
        connection.play(music)
      }
})

bot.login('token')

1 个答案:

答案 0 :(得分:0)

调用messageArray.slice(1)时,它返回一个数组,而不是我们想要的字符串
您可以执行以下操作:

  • 删除以下几行:
    let messageArray = message.content.split(" ")
    let command = messageArray[0]
    let args = messageArray.slice(1)
  • 将消息拆分为单个参数数组。调用split方法时,我们应该使用正则表达式而不是带有空格的字符串来匹配每个单个出现,因此即使用户不小心在参数之间键入了多余的空格也可以使用它。 arguments数组应包含命令。
let args = message.content.split(/ +/g);
let command = args[0];
  • 歌曲URL应该是用户提供的索引位置1中的参数:
let song = args[1];

您不再应该遇到TypeError,因为song现在是一个字符串,应该是YTDL正在寻找的类型。

免责声明::我以前从未使用过YTDL,所以关于错误的位置,我可能是错的。如果可能的话,请在您的问题中提供完整的堆栈跟踪。