Sebastien S
Sebastien S

Reputation: 11

Node.js request inside express server doesn't seem to work in parallel

I've a simple express server responding to one post request: app.post('/reportFiles', getReportLink);

The server is going to make a post request on another server then save the result into a json file. But it seems to be not working when i make multiple request. If I call 2 times my express server and the request to the other server are slow, I'll get the result of my first request but never my second (request are the same, just called 2 times).

Here is my code for the function getReportLink:

function getReportLink(req,res){
    var params = req.body;

    // Send 200 response -> Doing the job in background
    respond(res,200,'OK');

    var json;
    var requestName = params.requestName;
    var sessionId = params.sessionId;
    var startDate = params.startDate;
    var endDate = params.endDate;
    var customerId = params.customerId;
    var uaid = params.uaid;
    var jsonFileName = requestName+'_'+customerId+'_'+uaid+'_'+unix()+'.json';
    var platformUrl = require(current_path+path.sep+'platform').getPlatformUrl(config.environment);


    async.series([
        // Call getrequestName on spring-ws
        function(callback){
            var requestBody = {sessionId:sessionId,asynch:false,startDate:startDate,endDate:endDate,formatedForTimezone:true,timeZoneOffset:timeZoneOffset};
            var reportParams = params;
            _.each(_.keys(reportParams), function (key) {
                if(key==='reportType' && reportParams[key]<=0){
                    // We don't add it
                }else{
                    requestBody[key] = reportParams[key];
                }

            });
            logger.debug(jsonFileName);
            logger.debug(requestBody);

            request({
                uri: platformUrl+'get'+reportParams.requestName,
                method: 'POST',
                json: true,
                timeout: 600000,
                headers: {'content-type': 'application/json'},
                body: requestBody}, 
                function(error, response, body) {
                    if(!_.isUndefined(response)){
                        logger.debug(jsonFileName);
                        logger.debug('Response: '+ response.statusCode);
                    }
                    if (error || response.statusCode == 500) {
                        logger.debug(jsonFileName);
                        logger.error(error);
                        logger.debug('Received:'+JSON.stringify(body));
                        if(!_.isUndefined(returnUrl) && returnUrl){
                            return respond(res,500, 'Error when getting ressource');
                        } else {
                            return logger.error('Error when getting ressource');
                        }
                    } else {
                        json = body;
                        if( _.isUndefined(json) || _.isNull(json)){
                            logger.debug(jsonFileName);
                            logger.debug('Received:'+JSON.stringify(json));
                            if(!_.isUndefined(returnUrl) && returnUrl){
                                return respond(res,500, 'Error when getting ressource - not a json object');
                            } else {
                                return logger.error('Error when getting ressource - not a json object');
                            }
                        } else {
                            logger.debug(jsonFileName+' : '+' OK go to next');
                            callback(null, 'getReportName');
                        }

                    }
                });
        },
        // Save Json on filesystem
        function(callback){
            logger.debug(jsonFileName+' : '+' Saving on disk');
            if(_.isUndefined(json)){
                logger.error('Json is undefined...');
            }
            fs.writeFile(jsonFileName, JSON.stringify(json), 'utf8', function (err) {
                if (err) return logger.error(params);
                callback(null, 'writeJson');
            });
        }
    ]);
}

Upvotes: 0

Views: 561

Answers (1)

Sebastien S
Sebastien S

Reputation: 11

Solved this using node-fetch. Code instead of request now looks like this:

fetch(uri, { method: 'POST', body: JSON.stringify(requestBody), timeout: 600000, headers: {'content-type': 'application/json'} })
                .then(function(response) {
                    logger.debug('Response: '+ response.status + ' ok?'+response.ok);


                    if (!response.ok) {
                        logger.debug('Received: '+response.statusText);
                        return respond(res,500, 'Error when getting ressource. Status='+response.status);
                    } else{
                        json = response.json();
                        if( _.isUndefined(json) || _.isNull(json)){ 
                            return respond(res,500, 'Error when getting ressource');
                        } else {
                            callback(null, 'getReportName');
                        }
                    }
                });

Upvotes: 1

Related Questions