Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于get-response express填充数组_Javascript_Jquery_Node.js_Ajax - Fatal编程技术网

Javascript 基于get-response express填充数组

Javascript 基于get-response express填充数组,javascript,jquery,node.js,ajax,Javascript,Jquery,Node.js,Ajax,我有以下server.js get路径 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(u

我有以下server.js get路径

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有一些背景知识,但我不能就此结束。

您必须等待所有请求得到解决,然后将
最终结果
数组发送回客户端。您可以使用
async/await
Promise.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);
            }
        });
    });
});

因为您需要知道多个请求何时完成,所以我建议您切换到使用请求承诺库,以便可以使用承诺跟踪所有请求何时完成。该库还会自动为您检查状态代码。因此,您可以这样做:

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

在维护模式下编辑2020年1月-request()模块


仅供参考,
请求
模块及其衍生产品(如)目前处于维护模式,不会积极开发以添加新功能。你可以阅读更多关于推理的内容。中有一个备选方案列表,并对每个备选方案进行了讨论。我一直在使用我自己,它从一开始就使用Promissions,而且使用起来很简单。

使用Promissions看起来很干净。我现在唯一的问题是我遇到了一个CORS错误:跨源请求被阻止:同源策略不允许读取远程资源。(原因:缺少CORS标头“访问控制允许原点”)。我不明白为什么我的节点发出请求,而我只调用获取此信息的端点@jfriend00@user2737948-浏览器中是否出现CORs错误?如果是这样,浏览器在您发出ajax请求的页面的URL栏中显示了什么?我在另一个窗口中打开了我的索引,并指出了我文档中的地址。有必要将我的索引放在我的nodejs服务器中吗?@user2737948-你没有回答我在之前的评论中提出的任何问题,我不知道你最后的评论是什么意思。如果您想对
http://localhost:3000
,则您还需要从同一服务器加载网页,以便浏览器中的URL以
http://localhost:3000
。如果直接从文件系统加载网页,则不能使用Ajax来
http://localhost:3000