2017-02-11 10 views
0

Вот мой код. Когда я отправлю запрос, я не получу результат. Я не понял, почему он не работает в случае 1. Я немного изменил его и разместил внутри , затем, и он работает.Узел JS Не возвращает результат

Что я здесь делаю неправильно? Почему он не работает в случае 1? Как заставить его работать в случае 1 с, используя res.end() как случай 3.

Случай 1:

var vigeonCollector = function(req, res) { 

// console.log(req.body); 
try { 
    var store = JSON.parse(JSON.stringify(req.body).toString('utf8').replace("'",'"')); 
} 
catch (e) { 
    console.log("Error in JSON Parsing!"); 
    return res.status(422).json({"status":false, "message":"Unparsble JSON"}); 
} 

var payloads = []; 

store.timestamp = getTimeStamp(); // Should be tagged with current timestamp. 

// Adding event_day IST and UTC format. 
var currentUTCTime = new Date(); 
var currentISTTime = new Date(currentUTCTime.toLocaleString('en-US', { timeZone: 'Asia/Kolkata' })); 
store.event_day = currentUTCTime.toLocaleString().split(',')[0]; 
store.event_day_ist = currentISTTime.toLocaleString().split(',')[0]; 
store.advertiser_id_met = store.advertiser_id; 
store.device_id_met = store.device_id; 


// Call get on redis only once and use it for attribution. 
var redis_result; 
redis.get(store.device_id).then(function(jresult){ 
    redis_result = JSON.parse(jresult); 
    console.log(redis_result); 
    if (store.event_type == "UNINSTALLS") { 

     // Attributing user installed UTM Params. 
     store.event_properties.utm_medium = redis_result.user_installed_medium; 
     store.event_properties.utm_source = redis_result.user_installed_source; 
     store.event_properties.utm_campaign = redis_result.user_installed_campaign; 
     store.advertiser_id = redis_result.advertiser_id; 

    } 
    else { 

     // Tagging last user session UTM Params. 
     store.event_properties.utm_medium = redis_result.medium; 
     store.event_properties.utm_source = redis_result.source; 
     store.event_properties.utm_campaign = redis_result.campaign; 

    } 

    temp_obj = { topic: "vnk-clst", messages: JSON.stringify(store)}; 
    payloads.push(temp_obj); 
    console.log(payloads); 
    console.log("I'm Done!"); 

}); 

producer.send(payloads, function(err, data){ 
    console.log(data); 
    if (err) return res.status(503).json({ "status": false, "message": "503 Service Unavailable", "error": err }); 
    else return res.status(200).json({ "status": true, "message": "OK"}); 
}); 

}

Случай 2:

var vigeonCollector = function(req, res) { 

// console.log(req.body); 
try { 
    var store = JSON.parse(JSON.stringify(req.body).toString('utf8').replace("'",'"')); 
} 
catch (e) { 
    console.log("Error in JSON Parsing!"); 
    return res.status(422).json({"status":false, "message":"Unparsble JSON"}); 
} 

var payloads = []; 

store.timestamp = getTimeStamp(); // Should be tagged with current timestamp. 

// Adding event_day IST and UTC format. 
var currentUTCTime = new Date(); 
var currentISTTime = new Date(currentUTCTime.toLocaleString('en-US', { timeZone: 'Asia/Kolkata' })); 
store.event_day = currentUTCTime.toLocaleString().split(',')[0]; 
store.event_day_ist = currentISTTime.toLocaleString().split(',')[0]; 
store.advertiser_id_met = store.advertiser_id; 
store.device_id_met = store.device_id; 


// Call get on redis only once and use it for attribution. 
var redis_result; 
redis.get(store.device_id).then(function(jresult){ 
    redis_result = JSON.parse(jresult); 
    console.log(redis_result); 
    if (store.event_type == "UNINSTALLS") { 

     // Attributing user installed UTM Params. 
     store.event_properties.utm_medium = redis_result.user_installed_medium; 
     store.event_properties.utm_source = redis_result.user_installed_source; 
     store.event_properties.utm_campaign = redis_result.user_installed_campaign; 
     store.advertiser_id = redis_result.advertiser_id; 

    } 
    else { 

     // Tagging last user session UTM Params. 
     store.event_properties.utm_medium = redis_result.medium; 
     store.event_properties.utm_source = redis_result.source; 
     store.event_properties.utm_campaign = redis_result.campaign; 

    } 

    temp_obj = { topic: "vnk-clst", messages: JSON.stringify(store)}; 
    payloads.push(temp_obj); 
    console.log(payloads); 
    console.log("I'm Done!"); 

producer.send(payloads, function(err, data){ 
    console.log(data); 
    if (err) return res.status(503).json({ "status": false, "message": "503 Service Unavailable", "error": err }); 
    else return res.status(200).json({ "status": true, "message": "OK"}); 
}); 

}); 

} 

Дело 3: Добавление res.end() только b до последнего}.

ответ

1

Звонок в then в случае 1 непосредственно не дожидается завершения всего вашего кода в рамках функции, которую вы ему дали. Поэтому звонок producer.send(...) начинается слишком рано, прежде чем вы заполнили свою полезную нагрузку. Правильный путь - включить producer.send(...) в функцию, которую вы дали then(). Вызов res.end() здесь не должен быть актуальным.

+0

спасибо за объяснение. Но если вы видите https://github.com/Gowtham95india/CapVengine/blob/master/server.js statsCollector, в которой я звоню, производитель.send работает нормально. Это потому, что forEach цикл задерживает вызов, и объект нажат? И вы сказали, продюсер.сенд начинается слишком рано, если это так, он должен вернуть 200. Разве нет? поскольку я возвращаю 200 в функцию manufacturer.send, и это не имеет значения, даже если я отправляю пустую полезную нагрузку, kafka возвращает true. Не могли бы вы объяснить это? –

+0

Реализация 'statsCollector()' очень хрупкая, и нет гарантии, что ваша структура 'payloads' будет заполнена полностью до того, как вы передадите ее' manufacturer.send() '. – Marc

+0

Вы понимаете концепцию, лежащую в основе обещаний в Javascript? Они «живут» за функцией 'then()' и т. Д. ..... – Marc