Http使用node express从不同的API端点获取多个json文件

时间:2013-04-25 11:05:17

标签: javascript json node.js express pug

我正在研究使用节点从不同API端点获取多个JSON文件的最有效方法。

基本上我想将每个JSON对象存储在一个变量中,并将它们全部发送到Jade模板文件进行解析。 我已经通过执行以下操作来设置单个 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端点并将它们发送到home jade模板。

有效地做到这一点的任何想法?

1 个答案:

答案 0 :(得分:0)

根据您的代码,这是使用优秀async库的快速示例。

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
        });
    });
});