我目前难以解决一个问题,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 对象中查看了我的参数,一切看起来都很好。甚至用卷曲测试了这个并且给出了预期的响应。
答案 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 ,它按预期工作。