我目前正在discord.js中制作一个discord机器人,我正在尝试制作一个音乐功能.现在我知道这个功能的工作原理,因为我已经通过给它一个设置的视频URL进行了测试.我最近试图实现对用户输入的支持(例如,使用youtube API,但当我试图检索URL时,我遇到了错误信息。$play vfx artists react
我最近试图实现对用户输入的支持(例如,使用youtube API,但当我试图检索网址时,我遇到了错误信息。
我知道这个错误与承诺有关,因为当我试图检索标题和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
有兴趣的朋友,可以找到代码 此处我知道这是一个火车头,计划以后用导出导入的东西把它转换为模块。
return
从 youTube.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回答的范围。