根据get response express填充数组

时间:2018-03-03 17:57:41

标签: javascript jquery node.js ajax

我有以下server.js get route

app.get('/', function(req, res) {
var url;
var final_res = [];
endpoints.forEach(function(url){
    request(url, function(error,response,body){
        if(!error && response.statusCode == 200){
            final_res.push(url.url);
            console.log(url.url);
        }else{
            res.send(err);
            console.log(err);
        }
    });
});
});

这是我的客户端js,我用jQuery获取这个完全相同的get

$(document).ready(function() {
$.get('http://localhost:3000/', function(data) {
    console.log(data);
    $("#body").text(data);
});
});

当我打开我的index.html时,它正确地显示了用户界面,并且在我执行我的server.js的终端内,它正确显示了url。我无法实现的是如何使用我的jQuery收到的数据来填充我的html中的表。我的表格将填充从我的端点获取的网址。

我在nodejs中有一些背景但我无法将其包装起来。

2 个答案:

答案 0 :(得分:1)

由于您需要知道多个请求何时完成,我建议您切换到使用请求承诺库,以便您可以使用promises来跟踪所有请求何时完成。该库还会自动为您检查statusCode。所以,你可以这样做:

const rp = require('request-promise');

app.get('/', function(req, res) {
    Promise.all(endpoints.map(url => {
        return rp(url).then(r => {
            return url.url;
        }).catch(err => {
            // rather than error, just return null result
            return null;
        })
    })).then(results => {
        // filter out null values, then send array as the response
        res.json(results.filter(item => item !== null));
    }).catch(err => {
        console.log(err);
        res.sendStatus(500);
    });
});

这将并行运行所有请求,但按顺序收集结果,这将导致最快的整体运行时间。

如果你想一次运行它们,你可以像这样使用async / await:

const rp = require('request-promise');

app.get('/', async function(req, res) {
    let results = [];
    for (let url of endpoints) {
        try {
            let r = await rp(url);
            if (r) {
                results.push(url.url);
            }
        } catch(e) {
            // ignore error
        }
    }
    res.json(results);
});

答案 1 :(得分:0)

您必须等待所有请求得到解决,然后将final_res数组发送回客户端。您可以使用async/awaitPromise.all概念执行此操作。如果您不想使用这些资源,那么您需要手动计算并等待所有请求,使用计数器知道所有请求何时完成,如下所示:

app.get('/', function(req, res) {
    var url;
    var final_res = [];
    var respCounter = endpoints.length;
    endpoints.forEach(function(url){
        request(url, function(error,response,body){
            respCounter--;
            if(!error && response.statusCode == 200){
                final_res.push(url.url);
                console.log(url.url);
            }else{
                res.send(err);
                console.log(err);
            }
            if(respCounter == 0) {
                res.send(final_res);
            }
        });
    });
});