0

我正在研究使用 node.js 从不同 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 玉模板。

有什么想法可以有效地做到这一点吗?

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 回答