0

带有 Youtube API 请求的 Promise

我目前正在 discord.js 中制作一个不和谐的机器人,并且我正在尝试制作一个音乐功能。现在我知道这个功能有效,因为我通过给它一个设置的视频 URL 对其进行了测试。我最近尝试实现对用户输入的支持(例如$play vfx artists react,使用 youtube API,但是当我尝试检索 url 时遇到错误消息。

我知道错误与承诺有关,因为当我尝试检索标题和 URL 时,API 并没有真正检索到数据。我对承诺不是很好,到目前为止我的尝试都是徒劳的,所以任何帮助都将不胜感激。

代码 ->

相关的 npm 模块。

const YouTube = require('youtube-node');
var youTube = new YouTube();
youTube.setKey('MyKey');

这是我得到错误的函数,我以前听说过承诺,但是每次我使用一个时,我要么记录一个“待处理的承诺”,要么遇到一个错误。

function addVideo(term) {
    youTube.search(term, 1,
        function (error, result) {
            return [result.items[0].snippet.title, result.items[0].id.videoId];
        });
}

然后我在这里调用这个函数,

searchResult = addVideo(args.join(' '))
song = {
    title: searchResult[0],
    url: searchResult[1],
};

在线发现错误title: searchResult[0]

(node:4) UnhandledPromiseRejectionWarning: TypeError: Cannot read property '1' of undefined

对于那些感兴趣的人,可以在这里找到代码。 我知道这是一个 trainwreck atm,计划稍后使用导出/导入的东西将其转换为模块。

4

1 回答 1

0

returning fromyouTube.search()的回调不会做你认为它做的事情。因为 Javascript 是异步的。 addVideo在搜索完成之前很久就返回给它的调用者。

您需要执行类似的操作来处理回调函数内部的结果。

function addVideo(term) {
    youTube.search(term, 1,
        function (error, result) {
            if (error) throw new Error (error);
            song = {
              title: result[0],
                url: result[1],
            };
            /* do whatever you wanted to do with song */
        }
    );
}

如果您弄清楚如何将 youtube API 包装在一个 Promise 中,那么您将能够使用async函数。这将使您的逻辑更易于阅读。但是解释所有这些超出了堆栈溢出答案的范围。

于 2020-05-28T12:04:01.683 回答