Music discord.js bot:“url”参数必须是字符串类型

Posted

技术标签:

【中文标题】Music discord.js bot:“url”参数必须是字符串类型【英文标题】:Music discord.js bot : The "url" argument must be of type string 【发布时间】:2020-09-19 13:41:29 【问题描述】:

我正在尝试使用 discord.js 和 ffmpeg 制作一个可以工作的音乐 Discord 机器人,但我不断收到错误 TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. Received type undefined。当我尝试命令play机器人加入语音通道并发送???? | En cours de lecture : $song.title 时发生错误。假设该命令可以与 URL 或搜索字符串一起使用。它会在 2 种情况下产生错误。 这是命令的代码和使用的两个函数:

if (command === "play" || command === "p") 

    const args = args[1] ? args[1].replace(/<(.+)>/g, "$1") : "";
    const searchString = args.slice(1).join(" ");
    if (!args[1]) 
      return message.channel.send('Il faut spécifier une URL !')
        .catch(console.error);
    
    const url = args[1].toString();
    const serverQueue = queue.get(message.guild.id);
    var voiceChannel = message.member.voice.channel;
    if (!voiceChannel) return message.channel.send("Tu dois être dans un salon vocal pour utiliser cette commande !");
    const permissions = voiceChannel.permissionsFor(message.client.user);
    if (!permissions.has("CONNECT")) 
      return message.channel.send("J'ai besoin de la permission **`CONNECT`** pour cette commande");
    
    if (!permissions.has("SPEAK")) 
      return message.channel.send("J'ai besoin de la permission **`SPEAK`** pour parler");
    

    if (url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)) 
      const playlist = await youtube.getPlaylist(url);
      const videos = await playlist.getVideos();
      for (const video of Object.values(videos)) 
        const video2 = await youtube.getVideoByID(video.id); // eslint-disable-line no-await-in-loop
        await handleVideo(video2, message, voiceChannel, true); // eslint-disable-line no-await-in-loop
      
      return message.channel.send(`:white_check_mark:  **|**  Playlist: **\`$playlist.title\`** a été ajouté à la playlist !`);
     else 
      try 
        var video = await youtube.getVideo(url);
       catch (error) 
        try 
          var videos = await youtube.searchVideos(searchString, 10);
          let index = 0;
          // eslint-disable-next-line max-depth
          try 

           catch (err) 
            console.error(err);
            return message.channel.send("Annulation de la commande...");
          
          const videoIndex = parseInt(1);
          var video = await youtube.getVideoByID(videos[videoIndex - 1].id);
         catch (err) 
          console.error(err);
          return message.channel.send("????  **|**  Je n'obtiens aucun résultat :pensive:");
        
      
      return handleVideo(video, message, voiceChannel);
    


async function handleVideo(video, message, voiceChannel, playlist = false) 
  const serverQueue = queue.get(message.guild.id);
  const song = 
    id: video.id,
    title: Util.escapeMarkdown(video.title),
    url: `https://www.youtube.com/watch?v=$video.id`
  ;
  console.log(song.url)
  if (!serverQueue) 
    const queueConstruct = 
      textChannel: message.channel,
      voiceChannel: voiceChannel,
      connection: null,
      songs: [],
      volume: 5,
      playing: true
    ;
    queue.set(message.guild.id, queueConstruct);

    queueConstruct.songs.push(song);

    try 
      var connection = await voiceChannel.join();
      queueConstruct.connection = connection;
      play(message.guild, queueConstruct.songs[0]);
     catch (error) 
      console.error(`Je ne peux pas rejoindre le salon vocal : $error`);
      queue.delete(message.guild.id);
      return message.channel.send(`Je ne peux pas rejoindre le salon vocal : **\`$error\`**`);
    
   else 
    serverQueue.songs.push(song);
    console.log(serverQueue.songs);
    if (playlist) return undefined;
    else return message.channel.send(`:white_check_mark:  **|** **\`$song.title\`** a été ajouté à la playlist !`);
  
  return undefined;


function play(guild, song) 
  const serverQueue = queue.get(guild.id);

  if (!song) 
    serverQueue.voiceChannel.leave();
    queue.delete(guild.id);
    return;
  

  const dispatcher = serverQueue.connection.play(ytdl(song.url))
    .on("end", reason => 
      if (reason === "Stream is not generating quickly enough.") console.log("Musique terminée.");
      else console.log(reason);
      serverQueue.songs.shift();
      play(guild, serverQueue.songs[0]);
    )
    .on("error", error => console.error(error));
  dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);

  serverQueue.textChannel.send(`????  **|**  En cours de lecture : **\`$song.title\`**`);
;

【问题讨论】:

【参考方案1】:

试试这个:

在您的控制台中输入npm list ytdl-core,如果版本不是ytdl-core@2.1.5 or newer,请输入npm i ytdl-core@latest

这解决了我的问题。

【讨论】:

以上是关于Music discord.js bot:“url”参数必须是字符串类型的主要内容,如果未能解决你的问题,请参考以下文章

从 discord.js 中的消息中获取 Emoji url

discord.js 获取画布附件的 URL

尝试为 Discord bot 编写音乐播放器时出错

如何使用 discord.js 从 discord bot 向特定用户发送消息

Discord.js Discord Bot:SyntaxError:输入意外结束

Discord bot 更改前缀命令出错 (discord.js)