当在discord.js中获取视频url并使用Youtube Api时,承诺拒绝[重复]。

问题描述 投票:0回答:1

承诺与Youtube API请求

我目前正在discord.js中制作一个discord机器人,我正在尝试制作一个音乐功能.现在我知道这个功能的工作原理,因为我已经通过给它一个设置的视频URL进行了测试.我最近试图实现对用户输入的支持(例如,使用youtube API,但当我试图检索URL时,我遇到了错误信息。$play vfx artists react我最近试图实现对用户输入的支持(例如,使用youtube API,但当我试图检索网址时,我遇到了错误信息。

我知道这个错误与承诺有关,因为当我试图检索标题和URL时,API实际上还没有检索数据。我对承诺不是很在行,到目前为止,我的尝试都是徒劳的,所以任何帮助都将是非常感激的。

代码-&gt。

相关的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

有兴趣的朋友,可以找到代码 此处我知道这是一个火车头,计划以后用导出导入的东西把它转换为模块。

javascript node.js discord.js youtube-javascript-api ytdl
1个回答
0
投票

returnyouTube.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 包裹在承诺中,你就可以使用 async 函数。这将使你的逻辑更容易阅读。但解释这些已经超出了Stack Overflow回答的范围。

© www.soinside.com 2019 - 2024. All rights reserved.