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 从 discord bot 向特定用户发送消息