根据get response express填充数组

我有以下server.js获取路由

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中的表。 我的表格将填充从我的端点获取的url。

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

由于您需要知道多个请求何时完成,我建议您切换到使用请求承诺库,以便您可以使用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); }); 

您必须等待所有请求得到解决,然后将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); } }); }); });