0

ノードを使用して、さまざまな API エンドポイントから複数の JSON ファイルを取得する最も効率的な方法を検討しています。

基本的に、各 JSON オブジェクトを変数に格納し、それらをすべて Jade テンプレート ファイルに送信して解析したいと考えています。次のようにして、 1 つのJSON ファイル (jsonFile1)を取得するようにセットアップしました。

httpOptions = {
    host: 'api.test123.com',
    path : '/content/food/?api_key=1231241412',
    headers: {
        "Accept": "application/json",
        'Content-Type': 'application/json'
    },
    method: "GET",
    port: 80
}

var jsonFile1;

http.get(httpOptions, function(res) {
    var body = '';

    res.on('data', function(chunk) {
        body += chunk;
    });

    res.on('end', function() {
        jsonFile1= JSON.parse(body)
        console.log("Got response: " + jsonFile1);
    });
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});

app.set('views', __dirname);

app.get('/', function(req, res) {
    res.render('home', {
        data: jsonFile1
    });
});

しかし、複数のjsonエンドポイントを取得してホームジェイドテンプレートに送信するために、これらすべてを繰り返す必要はありません。

これを効率的に行うためのアイデアはありますか?

4

1 に答える 1

0

コードに基づいて、これは優れた非同期ライブラリを使用した簡単な例です。

var async = require('async'),
    // Array of apis
    httpOptions = [
        {
            host: 'api.test123.com',
            path : '/content/food/?api_key=1231241412',
            headers: {
                "Accept": "application/json",
                'Content-Type': 'application/json'
            },
            method: "GET",
            port: 80
        },
            host: 'api.test234.com',
            path : '/content/food/?api_key=1231241412',
            headers: {
                "Accept": "application/json",
                'Content-Type': 'application/json'
            },
            method: "GET",
            port: 80
        }
    ];

// Put the logic for fetching data in its own function
function getFile(options, done) {
    http.get(options, function(res) {
        var body = '';

        res.on('data', function(chunk) {
            body += chunk;
        });

        res.on('end', function() {
            done(null, JSON.parse(body));
            console.log("Got response: " + jsonFile1);
        });
    }).on('error', function(e) {
        done(e);
        console.log("Got error: " + e.message);
    });
}


app.get('/', function(req, res) {
    // Map the options through the getFile function, resulting in an array of each response
    async.map(httpOptions, getFile, function (err, jsonFiles) {
        // You should probably check for any errors here
        res.render('home', {
            data: jsonFiles
        });
    });
});
于 2013-04-25T13:01:48.827 に答える