2017-02-11 12 views
0

ここに私のコードです。リクエストを送信すると、結果が返ってきません。私は、なぜそれがケース1で動作していないのか分からなかった。少し修正して、それをに入れて、次にとしている。ノードJS結果を返さない

私はここで間違っていますか? なぜケース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:

は、それが

ケース3のようにケース1をres.endを()を使用してと、ケース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"}); }); }); } 

ケース3: res.end()を追加するb最後に}。

答えて

1

ケース1のthenへの呼び出しは、あなたが渡した関数内のコードがすべて終了するまで直接待機しません。したがって、producer.send(...)の呼び出しは、ペイロードを書き込む前に早すぎます。正しい方法は、then()に与えた関数にproducer.send(...)を含めることです。 res.end()への呼び出しは、ここでは関係ありません。

+0

説明をいただきありがとうございます。しかし、私がproducer.sendを呼び出しているhttps://github.com/Gowtham95india/CapVengine/blob/master/server.js statsCollector関数がうまく動作していればそれはforEachループが呼び出しを遅延させ、オブジェクトがプッシュされているからですか? あなたが言ったように、producer.sendはあまりにも早く始まります。そうであれば、200を返します。そうではありませんか?私はproducer.send関数で200を返すので、空のペイロードを送信しても問題はありません。カフカがtrueを返します。 説明してください。 –

+0

'statsCollector()'の実装は非常に壊れやすく、 'payloads'構造体が' producer.send() 'に渡す前に完全に埋められているという保証はありません。 – Marc

+0

Promises in Javascriptのコンセプトを理解していますか?彼らは 'then()'関数などの後ろに "生きている"。 – Marc

関連する問題