Node Express JS - обработка одновременных POST-запросов к серверу

1

У меня есть проект узла, реализующий express для обработки входящих запросов GET/POST, я создал маршруты для обработки различных запросов. У меня есть маршрут as /api/twitter/search который в основном вызывает функцию, которая использует обещания для получения твиттер-каналов и отправляет данные в ответ с помощью response.write

Теперь ситуация здесь, когда я делаю два одновременных запроса на один и тот же маршрут с одними и теми же входными данными, тогда как-то текущий код обоих запросов совпадает, давая непоследовательный ответ. Я хочу, чтобы любое количество запросов на сервер обрабатывалось отдельно, даже если действие с запросом содержит несколько асинхронных вызовов/обещаний.

Может кто-нибудь, пожалуйста, помогите мне здесь. Я абсолютно не знаком с разработкой js, поэтому любая помощь будет оценена

Ниже приведен код:

Маршрут, который я создал, выглядит следующим образом:

app.post('/api/twitter/fetch',function(req,res){
        var hashTag = req.body.hashtag;
        var userVals = {
            userEmail: req.body.uemail,
            tokenVal: req.body.utoken
        }
        tokenController.validateToken(userVals,function(error,data){
            returnObject = {status:true, data:'', error:''};
            if(error!=''){
                returnObject.status = false;
                returnObject.data = data;
                returnObject.error = error;
                res.send(returnObject);       
            }else{
                var twitterController = require('../controllers/testTwitterController');
                twitterController.fetchTweets(res,hashTag);
            }
        });
    });

Ниже приведен код функции fetchTweets:

var Twitter = require('twitter');
var params = require('../config/params.js');
var moment = require('moment');
//var promise = require('promise');
var globalHashTag = ''; var tweetArr = []; var  responseHandle = [];
client = new Twitter({
    consumer_key: params.consumer_key,
    consumer_secret: params.consumer_secret,
    access_token_key: params.access_token_key,
    access_token_secret: params.access_token_secret

});
function fetchTweetsAsync(hashTag,max_id){
    var days = 7; //Days you want to subtract from today
    var tillDate = (new Date()).toISOString().split('T')[0];
    var sinceDate = (new Date((new Date).getTime() - ((days) * 24 * 60 * 60 * 1000))).toISOString().split('T')[0];
    var param = {q:'#'+hashTag+' since:'+sinceDate+' until:'+tillDate,include_entities:true,result_type:'recent',count:100};
    if(max_id !== '' || typeof max_id != undefined)
        param.max_id = max_id;
    return new Promise(function(resolve,reject){
        // do a thing, possibly async, then..
        client.get('search/tweets',param,function(error,tweets,response){
            if(error){
                console.log(error);
                process.exit(1);
            }
            if(tweets.statuses.length){//If we get tweets, send them via promise
                //console.log("\n\n\n\n--------------------------------------------------------- Tweets fetched for #"+hashTag+ "-------------------------------------------------------------\n\n\n");
                resolve(tweets.statuses,hashTag);
            }
        });
    });
};


function getMaxHistory(tweets,hash){
    //console.log("\n\n~~~~~~~~~~~~~~~~Total: "+ tweets.length + " results found!~~~~~~~~~~~~~~~~\n\n");
    tweets.map((tweet)=>{
        process.stdout.write('.');
        created_at = moment(tweet.created_at).format("YYYY-MM-DD");
        tweetArr.push(created_at);
    });
    max_id = tweets[tweets.length - 1].id - 1;
    if(tweets.length == 100){
        process.stdout.write('*');
        return fetchTweetsAsync(hash,max_id).then(getMaxHistory);
    }
    else{
        var total = tweetArr.length;
        var finalArr = []; 
        finalArr = getDateWiseCount(tweetArr);
        tweetArr = [];
        console.log("Count array generated!");
        console.log("Total: "+total);
        finalArr = JSON.stringify({status:true,total:total,counts:finalArr});
        return finalArr;
        // console.log(finalArr);
        //responseHandle.send([{status:true,total:total,counts:finalArr}]);
    }
}

function getDateWiseCount(tweetArr){
    tweetArr = tweetArr.sort(); //We have a sorted array, need to get the counts now


    var current = null;
    var count = 0; returnarr = [];

    for(var i = 0; i < tweetArr.length; i++)
    {
        if(tweetArr[i] != current)
      {
        if(count > 0)
        {
            var date = new Date(current).toISOString();
            var val = count;
            returnarr.push({date:date,value:val});
            //console.log(returnarr);
            //console.log(current + " " + count + "<br/>");

        }
        current = tweetArr[i];
        count = 1;
      }
      else
      {
        count++;
      }
    }

    if(count > 0){
        var date = new Date(current).toISOString();
        var val = count;
        returnarr.push({date:date,value:val});
    }
    return returnarr;
}

module.exports = {
    fetchTweets: function(res,hashTag){
        responseHandle = res;
        fetchTweetsAsync(hashTag).then(getMaxHistory).then(function(finalArr){
            res.write(finalArr);
            res.end();
        });
    }
};
Теги:
express
npm

1 ответ

2

Неожиданное поведение при обработке параллельных запросов, особенно когда один запрос влияет на другой запрос, почти всегда вызван тем, что переменные не объявляются (используя var, let или const) должным образом.

Это может привести к тому, что эти переменные станут глобальными, что означает, что они распределяются между всеми запросами, что может привести к возникновению всех проблем.

Если возможно, добавление поддержки linter вашему редактору может помочь поймать эти ситуации. Для Vim, обычно используемый плагин является syntastic, который может использовать eslint для проверки синтаксиса JS-кода. Существуют эквивалентные плагины для почти всех распространенных редакторов.

  • 0
    Я все еще сталкиваюсь с проблемой. К счастью, теперь у меня есть доступ к коду, я собираюсь отредактировать вопрос и опубликовать ответ через минуту. Я вполне уверен, что объявление может быть проблемой, но я не знаю, как справиться с этим в данном коде. Пожалуйста помоги!
  • 0
    Некорректно объявленная или необъявленная переменные: returnObject , created_at , max_id , return_arr и tweetArr .
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню