Javascript ReferenceError:未定义YouTube/YouTube API

Javascript ReferenceError:未定义YouTube/YouTube API,javascript,express,google-api,youtube-api,pug,Javascript,Express,Google Api,Youtube Api,Pug,我有以下代码,试图用YouTube数据API进行搜索。我正在使用express生成的堆栈和jade #player script. // 2. This code loads the IFrame Player API code asynchronously. var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api

我有以下代码,试图用
YouTube数据API
进行搜索。我正在使用
express生成的堆栈
jade

#player

    script.
        // 2. This code loads the IFrame Player API code asynchronously.
        var tag = document.createElement('script');

        tag.src = "https://www.youtube.com/iframe_api";
        var firstScriptTag = document.getElementsByTagName('script')[0];
        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

        // 3. This function creates an <iframe> (and YouTube player)
        //    after the API code downloads.
        var player;
        function onYouTubeIframeAPIReady() {
            player = new YT.Player('player', {
                height: '345',
                width: '540',
                videoId: 'M7lc1UVf-VE',
                events: {
                    'onReady': onPlayerReady,
                    'onStateChange': onPlayerStateChange
                }
            });
        }

        // 4. The API will call this function when the video player is ready.
        function onPlayerReady(event) {
            event.target.playVideo();
        }

        // 5. The API calls this function when the player's state changes.
        //    The function indicates that when playing a video (state=1),
        //    the player should play for six seconds and then stop.
        var done = false;
        function onPlayerStateChange(event) {
            if (event.data == YT.PlayerState.PLAYING && !done) {
                setTimeout(stopVideo, 6000);
                done = true;
            }
        }

        function stopVideo() {
            player.stopVideo();
        }

        function googleApiClientReady() {
            gapi.client.setApiKey('AIzaSyCgOmTzCI4-gkUhL4hOm9R6I9tmUlVqtCw');
            gapi.client.load('youtube', 'v3', function() {
                /**
                * This function searches for videos related to the keyword 'dogs'. The video IDs and titles
                * of the search results are logged to Apps Script's log.
                *
                * Note that this sample limits the results to 25. To return more results, pass
                * additional parameters as documented here:
                *   https://developers.google.com/youtube/v3/docs/search/list
                */
                function searchByKeyword() {
                    var results = YouTube.Search.list('id,snippet', {q: 'dogs', maxResults: 25});
                    for(var i in results.items) {
                        var item = results.items[i];
                        console.log('[%s] Title: %s', item.id.videoId, item.snippet.title);
                    }
                }

                searchByKeyword();
            });
        }

    script(src="https://apis.google.com/js/client.js?onload=googleApiClientReady")`
#播放器
剧本
// 2. 此代码异步加载IFrame播放器API代码。
var tag=document.createElement('script');
tag.src=”https://www.youtube.com/iframe_api";
var firstScriptTag=document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(标记,firstScriptTag);
// 3. 此函数用于创建(和YouTube播放器)
//API代码下载后。
var播放器;
函数onyoutubeiframeapiredy(){
player=新的YT.player('player'{
高度:'345',
宽度:“540”,
videoId:'M7lc1UVf VE',
活动:{
“onReady”:onPlayerReady,
“onStateChange”:onPlayerStateChange
}
});
}
// 4. 当视频播放器准备就绪时,API将调用此函数。
函数onPlayerReady(事件){
event.target.playVideo();
}
// 5. 当播放器的状态改变时,API调用此函数。
//该功能指示播放视频时(状态=1),
//玩家应该玩六秒钟,然后停下来。
var done=false;
函数onPlayerStateChange(事件){
如果(event.data==YT.PlayerState.PLAYING&&!done){
设置超时(停止视频,6000);
完成=正确;
}
}
函数stopVideo(){
player.stopVideo();
}
函数googleApiClientReady(){
gapi.client.setApiKey('aizasyggomtzci4-gkUhL4hOm9R6I9tmUlVqtCw');
load('youtube','v3',function(){
/**
*此函数用于搜索与关键字“dogs”相关的视频。视频ID和标题
*的搜索结果被记录到应用程序脚本的日志中。
*
*请注意,此示例将结果限制为25。若要返回更多结果,请通过
*此处记录的其他参数:
*   https://developers.google.com/youtube/v3/docs/search/list
*/
函数searchByKeyword(){
var results=YouTube.Search.list('id,snippet',{q:'dogs',maxResults:25});
对于(results.items中的var i){
var项目=结果。项目[i];
console.log('[%s]标题:%s',item.id.videoId,item.snippet.Title);
}
}
searchByKeyword();
});
}
脚本(src=”https://apis.google.com/js/client.js?onload=googleApiClientReady")`
根据我的代码,我认为它应该加载一个视频(确实如此),然后搜索“狗”,并将结果记录到控制台

但是,我收到错误消息:

ReferenceError:未定义YouTube

我不知道我做错了什么…可能是脚本没有加载…但我想我已经尝试过在所有可能的地方加载脚本

谢谢

更新

我放置了
脚本(
再次出现在底部-与我的原始代码一样…现在我可以确认
searchByKeyword
方法正在运行…但问题又回到了
YouTube未定义的问题上。在下面的代码块中,第一行来自我的console.log消息,我在
searchByKeyword
m开头输入了该消息ethod,第二行是相同的错误(这篇文章的标题):

searchByKeyword正在运行

引用错误:未定义YouTube

您最初的问题是,当加载
gapi.client
时,它会扩展基本
gapi
对象。要访问YouTube api,请使用
gapi.client.YouTube.search
而不是
YouTube.search

Javascript本身也是异步的,因此任何XHR请求的返回都必须在回调或promisified中

function searchByKeyword() {
  var request = gapi.client.youtube.search.list({
    q: 'dogs',
    part: 'snippet'
  });

  request.execute(function(results) {
    for(var i in results.items) {
      var item = results.items[i];
      console.log('[%s] Title: %s', item.id.videoId,item.snippet.title);
    }
  });
 }
}

最初的问题是,当加载
gapi.client
时,它会扩展基本
gapi
对象。要访问Youtube api,请使用
gapi.client.Youtube.search
而不是
Youtube.search

Javascript本身也是异步的,因此任何XHR请求的返回都必须在回调或promisified中

function searchByKeyword() {
  var request = gapi.client.youtube.search.list({
    q: 'dogs',
    part: 'snippet'
  });

  request.execute(function(results) {
    for(var i in results.items) {
      var item = results.items[i];
      console.log('[%s] Title: %s', item.id.videoId,item.snippet.title);
    }
  });
 }
}

你能解释一下
函数(结果)
是怎么回事吗?我知道我以前理解过它,只是现在有点模糊/生疏。基本上没有进入大量细节…
请求。execute
是一个接受函数(通常称为回调)的函数作为XHR返回时的第一个参数,它调用您的函数并将请求的结果作为第一个参数。这是一个经常使用的模式。谢谢-我现在就知道了哈哈…不需要太多的细节。您能解释一下
函数(结果)的情况吗
?我知道我以前理解过它,只是现在有点模糊/生疏。基本上没有进入大量细节…
请求。execute
是一个接受函数(通常称为回调)的函数作为XHR返回时的第一个参数,它调用您的函数并将请求的结果作为第一个参数。这是一个经常使用的模式。谢谢-我现在就知道了哈哈…不需要太多细节。