javascript - Node JS 不返回结果

标签 javascript node.js api request

这是我的代码。当我发送请求时,我没有收到结果。我不明白为什么它在情况 1 中不起作用。我稍微修改了一下并将其放入 then 中,它就起作用了。

我在这里做错了什么? 为什么它在案例 1 中不起作用? 如何让它在情况 1 中工作而不像情况 3 那样使用 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"});
});

}

情况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()。

最佳答案

调用then在情况 1 中,直接不会等到您提供给它的函数内的所有代码完成。所以调用producer.send(...)在你填满你的有效负载之前开始太早了。正确的方法是包含 producer.send(...)进入你给 then() 的函数。调用res.end()此处不应相关。

关于javascript - Node JS 不返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180437/

相关文章:

api - 我应该为自定义错误使用什么 HTTP 状态代码?

javascript - 如何在 Sequelize 中使用 UNION ..?或者像 UNION 这样的任何其他方法都期望 promise.All...?

javascript - 我应该使用哪个 node.js 套接字引擎?

javascript - Koa JS - 调用 API 后无法发送响应。总是收到 404

node.js - 将实时网络摄像头流式传输到服务器并返回到网络的最佳方式是什么?

ios - Swift iOS - 如何将 Firebase token 发送到 Heroku 上的 Https URL?

ios - 如何使用 Swift 4 和 Alamofire 从 API 获取数据

javascript - 如何通过普通 JavaScript 获取所选选项的数据属性?

javascript - 如何防止 CSS/HTML 下拉菜单部分显示在页面外?

php - 将 JavaScript 私钥转换为可在 PHP 中使用的私钥