【问题标题】:TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. Received an instance of ArrayTypeError [ERR_INVALID_ARG_TYPE]:“url”参数必须是字符串类型。收到 Array 的一个实例
【发布时间】:2020-11-21 01:29:02
【问题描述】:

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

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')

【问题讨论】:

  • 添加了降价功能以提高可读性

标签: discord.js


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,它帮助了我,但我有一个新的错误 connection.play() 不再是一个函数
  • 这意味着connection.play() 确实不是方法,或者connection 本身为空或未定义。记得用分号结束你的陈述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2022-11-10
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多