Discord bot youtube 搜索,等待异步函数的回答

Posted

技术标签:

【中文标题】Discord bot youtube 搜索,等待异步函数的回答【英文标题】:Discord bot youtube search, wait for answer of asynchronous function 【发布时间】:2018-11-07 07:57:26 【问题描述】:

我已经建立了一个不和谐但使用 javascript 我有一个命令,我希望能够搜索 youtube 视频并在语音频道中播放第一个结果。

我正在使用 discordjs 和 discord-youtube-api 库。

此代码查找要搜索的命令。 args 数组是搜索查询

else if (command === 'search') 
      isReady = false;
      if (message.channel.type !== 'text') return;

      const  voiceChannel  = message.member;

      if (!voiceChannel) 
        return message.reply('please join a voice channel first!');
      

      voiceChannel.join().then(connection => 
        const stream = ytdl(searchYouTubeAsync(args),  filter: 'audioonly' );
        const dispatcher = connection.playStream(stream);

        dispatcher.on('end', () => voiceChannel.leave());
        isReady = true;
      )

;

这是使用 youtube api 搜索视频并返回其 url 的函数。

async function searchYouTubeAsync(args) 
  var video = await youtube.searchVideos(args.toString().replace(/,/g,' '));
  console.log(video.url);
  console.log(typeof String(video.url));
  return String(video.url);

我在尝试该命令时确实收到以下错误消息。

(node:13141) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. Received type object
    at Url.parse (url.js:146:11)
    at Object.urlParse [as parse] (url.js:140:13)
    at Object.exports.getURLVideoID (/Users/alexanderhoerl/Developer/discord-music-bot/node_modules/ytdl-core/lib/util.js:248:20)
    at Object.exports.getVideoID (/Users/alexanderhoerl/Developer/discord-music-bot/node_modules/ytdl-core/lib/util.js:279:20)
    at getInfo (/Users/alexanderhoerl/Developer/discord-music-bot/node_modules/ytdl-core/lib/info.js:46:17)
    at ytdl (/Users/alexanderhoerl/Developer/discord-music-bot/node_modules/ytdl-core/lib/index.js:17:3)
    at voiceChannel.join.then.connection (/Users/alexanderhoerl/Developer/discord-music-bot/index.js:89:24)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:13141) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:13141) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我猜问题是音乐机器人在 searchYouTube 功能找到链接之前尝试加载流,因此没有提供有效的 url。虽然我不知道如何解决这个问题,因为该功能需要异步等待 youtube 搜索结果。

【问题讨论】:

【参考方案1】:

您可以在 async 函数中运行它:

voiceChannel.join().then(async connection => 
  let url = await searchYouTubeAsync(args);
  let stream = ytdl(url,  filter: 'audioonly' );
  let dispatcher = connection.playStream(stream);

  dispatcher.on('end', () => voiceChannel.leave());
  isReady = true;
)

【讨论】:

【参考方案2】:

我现在几乎可以肯定这是不真实的。但是,这里是解决方案:

const stream = ytdl(searchYouTubeAsync(args).toString(),  filter: 'audioonly' );

当我在 ytdl 遇到同样的问题时,

xxx.toString() 帮助了我。

【讨论】:

以上是关于Discord bot youtube 搜索,等待异步函数的回答的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Discord Bot 播放 YouTube URL

如何从 Youtube 向 discord bot python 发送视频

尝试通过语音通道播放 youtube 音频时 C# discord bot 未知操作码 8

Discord bot 活动但不响应命令 (js)

Discord bot异步/等待错误处理

如何让 discord bot 等待回复 5 分钟然后发送消息?使用不和谐的 js