【问题标题】:Node http module节点http模块
【发布时间】:2016-04-07 18:37:27
【问题描述】:

我目前遇到一个问题,http.request() 只是失败/跳过向给定 url 发出请求。我有以下设置

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 对象中的参数,一切看起来都很好。甚至用 curl 对此进行了测试并返回了预期的响应。

【问题讨论】:

  • http 使用哪个库?
  • 核心节点'http'模块,我想我有答案并且知道我为什么会遇到这个问题。我会尽快发布我的答案

标签: node.js


【解决方案1】:

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

基本上 当你的程序正在执行时 它这样做 1 - 发出http请求, 2 - 返回为空的 resData (因为函数执行到最后没有停止) 3 - http 请求返回,现在 resData 有值,但您的函数已经返回

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-02
      • 2021-10-11
      • 2012-10-28
      • 2016-09-24
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多