Youtube API 在 node.js Express 中使用异步处理多个依赖请求

Youtube API using async in node.js Express for multiple dependant requests

在我用于处理数据的自定义模块中,我发送了 2 个请求,首先从我的播放列表中获取视频列表,然后,我使用从第一个结果中获得的 videoID 发送了另一个请求。

因为第二个请求依赖于第一个请求,我正在使用异步模块的waterfall方法。

为了检查它是否正常工作,我在第二个函数中记录了第一个请求的结果,但网页不是 运行 并且在控制台中没有返回任何内容。

这里有什么问题吗?

var data = function(callback) {

    var request = require('request'),
        async = require('async');

    async.waterfall([

        function getVideo (getVideoCallback) {
            var url = "https://www.googleapis.com/youtube/v3/playlistItems";

            var properties = { 
                part: 'snippet, contentDetails', 
                playlistId: 'xxx',
                key: 'xxx',
                maxResults: 50
            }

            request({ url:url, qs:properties}, function(err, response, body) {
                if(err) { console.log(err); return; }
                body = JSON.parse(body);

                getVideo(body, getVideoCallback);
            });

        },

        function getVideoDetails (result, getVideoDetailsCallback) {

            console.log(result);

            ...

        }
    ], function (err, result) {

        if (err) { console.log(err); return; }

        callback(result);

    }); 
}

module.exports = data;

在您的第一个瀑布函数中

        request({ url:url, qs:properties}, function(err, response, body) {
            if(err) { console.log(err); return; }
            body = JSON.parse(body);

            getVideo(body, getVideoCallback);
        });

您再次调用了第一个瀑布函数而不是调用函数回调,这是一个带有错误参数的递归调用。为了前进到瀑布堆栈中的下一个函数,您需要像这样调用回调:

        request({ url:url, qs:properties}, function(err, response, body) {
            if(err) { console.log(err); return; }
            body = JSON.parse(body);

            getVideoCallback(null, body);
        });

结帐 async.js 瀑布示例:

waterfall example