节点http模块

时间:2016-04-07 18:37:27

标签: node.js

我目前难以解决一个问题,http.request()只是失败/跳过来向给定的网址发出请求。我有以下设置

async.waterfall([
    firstFunc,
    secondFunc,
    thirdFunc
], function last(err, result){});

thirdFunc 是我提出请求的地方,它看起来像以下

function thirdFunc(payload, callback){
    var responseFromCS = getData(payload);
    callback(null, responseFromCS);

}

getData 功能如下所示

function getData(obj){
    var curlttogetdata = csConstants.BasePath + csConstants.account_num;
    var accountNum = obj.customer.accountnum;
    var resData = null;
    curlttogetdata = curlttogetdata.replace('${accntNum}', accountNum);

    var getData = {
        hostname: csURLHost,
        path: curlttogetdata,
        method:'GET',
        headers: {
            'X-consumer-id': csConstants.ConsumerIDHeader,
            'Content-Type':'application/json'
        }
    };
    var req = http.request(getData, function (res){
        var body = '';
        res.on('data', function getData(chunk){
            body += chunk
        });

        res.on('end', function parseData(){
            try {
                resData = JSON.parse(body);
            }catch(err){
                resData = false;
            }
        });

    });

    req.on('error', function csResponseError(err){
        resData = false;
    });

    req.end();
    return resData;
}

现在在调试时,一旦调试器到达http.request(...),它就无法进入回调或发出请求,然后直接进入req.end()。没有返回错误。我已经多次在 getData 对象中查看了我的参数,一切看起来都很好。甚至用卷曲测试了这个并且给出了预期的响应。

2 个答案:

答案 0 :(得分:1)

我立即看到的一件事是你正在返回resData,好像它是一个同步执行,这意味着在从getData函数返回resData之后httpRequest返回,此时将返回null

基本上 当你的程序执行时 它做到了这一点 1 - 制作http请求, 2 -returns resData为null(因为函数执行到最后没有停止) 3 - http请求返回,现在resData有值但你的函数已经返回

您需要做的是传递一个回调函数 而不是

var responseFromCS = getData(payload);
you do getData(payload, function(responseFromCS){
//..... do something with the returned data
});

答案 1 :(得分:0)

好的,所以我相信我知道这背后的原因。 'http'节点模块是一个异步操作,函数 getData 处理这个,它在异步操作中包含在 thirdFunc 下。我相信这个操作会在 getData 响应之前执行。

所以我将http.request()移动到 thirdFunc ,它按预期工作。