由于范围问题,变量返回为未定义

时间:2014-09-16 07:29:21

标签: javascript json node.js youtube cheerio

我正在尝试获取youtube视频,以获取我从officialcharts.com上抓取的数据。 我能够抓取数据并为他们获取youtube网址。但是,当我尝试推动 数据只进入数组,标题和艺术家名称被推送。变量youtubeUrl未分配值。为什么变量youtubeUrl不在范围内?

我尝试了多种方法。我尝试在搜索功能中声明youtubeUrl然后在请求之外,但我得到了同样的问题。

我也尝试在搜索功能中移动json.tracks.push但是json不在范围内,因此没有任何内容添加到轨道

我正在使用https://www.npmjs.org/package/youtube-search搜索视频。

// Scraping charts
app.get('/scrape', function(req, res){

    url = 'http://www.officialcharts.com/music-charts/';

    request(url, function(error, response, html){
        if(!error){
            var $ = cheerio.load(html);
            var title, artist, youtubeUrl;
            var json = {tracks:[]};
            $('div .infoHolder').each(function(){
                var data = $(this);
                var opts = {
                    maxResults: 1,
                    startIndex: 1
                };

                // Scrapped title and artist name
                title = data.children('h3').text();
                artist = data.children('h4').text();


                // Searching for youtube videos
                search(title, opts, function (err, results) {
                    if (err) {
                        return console.log(err);
                    }
                     youtubeUrl = results[0].url;
                })


                console.log(youtubeUrl);  // THIS IS RETURNED UNDEFINED
                // youtubeUrl IS NOT PUSHED TO THE ARRAY
                // ONLY TITLE AND ARTIST PUSHED
                json.tracks.push({title:title,artist:artist,url: youtubeUrl});
            })
        }
        res.send(json);

    })
})

1 个答案:

答案 0 :(得分:-1)

我的猜测是你在.each()之外定义了youtubeUrl变量,然后尝试从search()函数中获取它。

尝试在.each()中声明youtubeUrl变量,因为它似乎不需要长时间保存数据。这应该够了吧。

编辑: 忘记我刚写的内容,因为我完全误读了你的代码。检查您在搜索功能中获得的内容。它似乎是异步的,因此在尝试获取其值后设置youtubeUrl var。您可以尝试将数据集合移动到搜索成功后调用的外部函数。

// Scraping charts
app.get('/scrape', function(req, res){

url = 'http://www.officialcharts.com/music-charts/';
function pushInfo(res,title, artist, youtubeUrl){
    res.send({title:title,artist:artist,url: youtubeUrl});
};
request(url, function(error, response, html){
    if(!error){
        var $ = cheerio.load(html);
        var title, artist, youtubeUrl;
        var json = {tracks:[]};
        $('div .infoHolder').each(function(){
            var data = $(this);
            var opts = {
                maxResults: 1,
                startIndex: 1
            };

            // Scrapped title and artist name
            title = data.children('h3').text();
            artist = data.children('h4').text();


            // Searching for youtube videos
            search(title, opts, function (err, results) {
                if (err) {
                    return console.log(err);
                }
                //youtubeUrl = results[0].url;
                pushInfo(res, title, artist, results[0].url);
            });
        });
    }
    });
});

这是完全未经测试的,因为我实际上并不知道搜索功能的作用,但是一旦搜索功能使用此方法完成,至少所有信息都应该可用。

相关问题