在 discord.js 中获取视频 url 并使用 Youtube Api 时承诺拒绝

Promise Rejection when fetching video url in discord.js and using the Youtube Api

与 Youtube 的承诺 API 请求

我目前正在 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');

这是我出错的函数,我以前听说过 promises,但每次我使用它时,我要么记录 'pending promise',要么遇到错误。

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

有兴趣的可以找代码here 我知道这是一个 trainwreck atm,计划稍后使用导出/导入东西将它转换为模块。

return来自 youTube.search() 的回调并没有按照您的想法进行。因为 Javascript 是异步的。 addVideo returns 在搜索完成之前很久就给它的调用者。

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

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 函数。这将使您的逻辑更易于阅读。但解释所有这些超出了 Stack Overflow 答案的范围。