在 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 答案的范围。
与 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 答案的范围。