angularjs - Node 应用程序中的请求超时

标签 angularjs node.js mongodb post

我向我的 Node api 发出的请求需要超过 4 分钟才能响应。收到响应的时间。 Angular 应用程序不接受响应。在 Firebug 上,网址变为红色。

我怎样才能克服这个问题。

api.route('/allsearch')
    .post(function(req,res){
        var filters=req.body.everything;
        var filterid=req.body.filterId;
        var searchid=req.body.searchid;
        var zipgroup=req.body.zipgroup;
        var myObject = new Array();


        function getData(docs,  filters, filterid, callback) {
            function loop(i) {
                searchingalgo(docs[i], filters, filterid,  function(pers){
                        myObject[i] = pers;
                        if (i < docs.length) {
                        loop(i + 1);
                        } else {
                            callback();
                        }
                    });
            };
            loop(0);
        };//closing get data() 

        Searchradius.findOne({"searchid" : searchid, user: req.decoded.id}).exec(function(err, docs) {


            // Array to hold async tasks
            var asyncTasks = [];

            // Loop through some items
            zipgroup.forEach(function(item){
              // We don't actually execute the async action here
              // We add a function containing it to an array of "tasks"
              asyncTasks.push(function(callback){
                // Call an async function, often a save() to DB
                console.log(item);
                searchingalgo(item, filters, filterid,  function(pers){
                        myObject[item] = pers;
                      // Async call is done, alert via callback
                  callback();
                });
              });
            });


            Async.parallel(asyncTasks, function(){
                //console.log(myObject);
                Searchradius.update({ _id: searchid }, { $set: { ucounteds: myObject , uzips: zipgroup }}, function(err, result){
                    if(err) {
                        res.send(err);
                        return;
                    }
                    var fields = ['city', 'state', 'zip','distance', 'count'];
                    var myresults = [];
                    var tc=0;
                    var newMyobj= new Array();
                    co=0;
                    zipgroup.forEach(function(item){
                        tc+=myObject[item];
                        //myresults.push(jobj);
                    });

                    for(i=0;i<zipgroup.length;i++){
                        newMyobj[i]=myObject[zipgroup[i]];
                    }
                    console.log(tc);

                    Searchfilter.update({ _id: filterid }, { $set: { counted_results: tc }}, function(err, resultupdate){
                        //console.log(resultupdate);
                        //console.log(tc);
                    });




                //  console.log(myObject);
                //  console.log(newMyobj);
                    res.json({ 
                    success: true,
                    zips: zipgroup,
                    states: docs.states,
                    cities: docs.cities,
                    distances: docs.distances,
                    counted_results : newMyobj,
                    });

                });     //update searchradius
            });         //getdata function 
        });             //searchradius findone
    });

根据要求,这是我的 Node API。 zipgroup 是一个像

这样的 zip 数组
[37663, 37664, 37669, 37671, 37660, 37669, 37667, 37668, 37666, 37665, 37662, 37661]

需要说明的是,Consumer1s 集合有超过 2900009876 个文档。它已正确编入索引,并且查询花费的时间尽可能少。但我仍然面临这个问题。 任何建议都会有所帮助。

这是我来自 Angular Controller 的帖子请求。

$http.post('/api/allsearch',
        {
            "everything":$scope.filterSearch ,
            "searchid":$routeParams.id, 
            "filterId": $scope.filterId, 
            "zipgroup" : $scope.zipgroup
        })
        .success(function(data){

            for(var i=0; i<data.zips.length;i++){
                oneset={
                    "zip": data.zips[i],
                    "state": data.states[i],
                    "city": data.cities[i],
                    "distance": data.distances[i],
                    "count": data.counted_results[i]
                };
                $scope.totalCount+=data.counted_results[i];
                $scope.results.push(oneset);
            }
            angular.forEach($scope.results, function (result) {
                    result.distance = parseFloat(result.distance);
                });
            $rootScope.processing=false;
            $scope.filterlinkdisplay=true;
    }); 

最佳答案

至少有几个选项:

  1. 设置AngularJS $http timeout 10分钟左右,这样AngularJS请求不会超时,等待4分钟获取数据
  2. 轮询:1) AngularJS 应用执行初始请求 2) Node.js 服务器针对此请求向 AngularJS 应用发出唯一 token 并开始收集数据 3) AngularJS 应用等待几分钟,然后使用先前收到的 token 发出请求以获取数据 4) 如果结果准备就绪,则您已完成。如果没有,再等一下,再做一次来自 AngularJS 的请求
  3. use WebSocket 。在客户端它被许多浏览器支持,在服务器端使用 ws .这是一个双向协议(protocol),因此服务器可以在数据准备就绪时通知客户端。

关于angularjs - Node 应用程序中的请求超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34761782/

相关文章:

javascript - ng-repeat 中 2 个不同的 div 上的 2 次 ng-click 不起作用

javascript - 使用 Bootstrap 多次使用 Angular 指令时正确注入(inject) d3.js 图形

javascript - Order 组件函数内部出现未定义错误

javascript - 苹果电脑 : Node JS Mongo Database Error: Connection Refused

javascript - Angular .min.js :118 Error: [ng:areq]

javascript - 找不到模块的声明文件

node.js - 在 Node 中使用 pty 和 ssh2 来使用 sudo 执行命令

node.js - gulp 命令给出模块错误找不到

mongodb - 我如何根据 _id 使用 Mongoose 进行更新?

javascript - 在 MongoDB View 聚合中使用 $gt 运算符