使用node http模块和request模块请求无响应
node环境
- node版本:0.10.34
问题描述:
给app应用接第三方登陆付费SDK时,登陆验证的时候使用post请求,请求无响应,无报错,回调接口没有调用。但是对方接收到了请求,也成功返回了数据。
注:仅仅请求该渠道接口才会无响应,其他渠道均正常。
请求代码如下:
var http=require('http');
var querystring=require('querystring');
//发送 http Post 请求
var postData = querystring.stringify({"user_id":"54",
"token":"29005b674967f413ebf20e5686e4d147"
});
var options = {
hostname:'youle.maiugame.com',
port:80,
path:'/sdk.php/LoginNotify/login_verify',
method:'POST',
headers:{
'Content-Type':'application/json; charset=UTF-8',
"Connection":"keep-alive"
}
};
try{
var req = http.request(options, function(res) {
//此处未打印,没有执行该回调
console.log('Status:',res.statusCode);
console.log('headers:',JSON.stringify(res.headers));
res.setEncoding('utf-8');
res.on('data',function(chun){
console.log('body分隔线---------------------------------\r\n');
console.info(chun);
});
res.on('end',function(){
console.log('No more data in response.********');
});
});
req.on('error',function(err){
console.error(err);
});
req.write(postData);
req.end();
}catch(err) {
console.error('发生异常:',err);
}
问题查找
尝试使用curl、浏览器访问、postman请求均有相应,SDK方使用以上代码请求也有响应,发现仅仅使用我们的服务器无响应,最后使用不同的node版本跑以上代码,发现跟node版本可能有关系。node版本0.10.的旧版本均无响应,node 6.0 及 8.0 的版本均请求正常。所以初步觉得跟node版本有关(ps:但是0.10.~版本的node 请求别的接口都是正常的啊,唯独这个不行,是不是跟SDK方的代码有关系啊~ 哎,不知道,不明了)
问题解决
之前尝试各种改代码,各种测试,搞了一天半,真心是心力交瘁,找bug不可怕,重要的是解决没有bug的bug。。。
正好这两天,带我的大佬回家准本结婚,都心灰意冷打算等大佬回来解决的,突然灵机一动,直接在代码里使用curl 命令请求试试,一试果然成功啦!!!泪流满面中。。。
早点这样就好了,虽然并不知道这是不是个好的解决方法,但是也算是解了我的燃眉之急啊~~~所谓能够解决问题的方法就是好方法
最终解决问题的代码
var exec = require('child_process').exec;
var comStr = 'curl -l -H "Content-type: application/json" -X POST -d ' + '\'' +JSON.stringify({"token":"29005b674967f413ebf20e5686e4d147","user_id":"54"}) +'\' '+ 'http://youle.maiugame.com/sdk.php/LoginNotify/login_verify';
console.error(cmdStr);
exec(comStr, function(err,stdout,stderr){
if(err) {
console.log('登陆验证失败:',err);
} else {
var data = JSON.parse(stdout);
console.log(data);
}
});
工作中经常遇到解决不了的问题,都没有记录下来,这是第一篇,以后多记录总结。