Nodejs https请求报错{ [Error: socket hang up] code: 'ECONNRESET', sslError: undefined }
Nodejs https请求报错{ [Error: socket hang up] code: ‘ECONNRESET’, sslError: undefined }
在模拟一个post请求去抓取返回页面中的一些数据,该请求是https的,代码如下:
var https = require('https');
var url = "https://cargo.china-airlines.com/CCNet/pgFreightStatus/cgoTrack.aspx?AWBPrefix=297&AWBNumber=86097782";
var post_option = require('url').parse(url);
post_option.method = 'POST';
post_option.port = 443;
var post_data = require('querystring').stringify({
ScriptManager1: 'ScriptManager1|btnQuery',
__EVENTTARGET: '',
__EVENTARGUMENT: '',
__VIEWSTATE: '/wEPDwUKMTY2MDI5MzU5MQ9kFgICAw9kFggCAg8PFgQeCkZ1bmNfVGl0bGVlHhBGdW5jX0Rlc2NyaXB0aW9uZWQWCgIBDw8WAh4EVGV4dGVkZAIDDw8WAh8CZGRkAgYPDxYCHwJlFggeC29ubW91c2Vtb3ZlBVl2YXIgZHZIaW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdkhpbnQnKTsgZHZIaW50LmlubmVySFRNTD0nJztTaG93SGludChldmVudCxkdkhpbnQpOx4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywnL1BYMDQwMjIvUmN2T25DYWxsRGF0YS5hc3B4P29uY2FsbF9mdW5jX3RpdGxlPSZub21lbnU9WSZub3RpdGxlbWVudT1ZJykeC29ubW91c2VvdmVyBSR0aGlzLmNsYXNzTmFtZSArPSAnIGluZm90aXRsZWhvdmVyJztkAgoPDxYCHwIFBy9DQ05ldC9kZAIMD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5eiBkZAIFDw8WAh4HVmlzaWJsZWhkZAIGDw9kFgIeB09uQ2xpY2sFO2phdmFzY3JpcHQ6IHJldHVybiBDaGVja0FXQigndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYKAgcPPCsADQEBEBYCAggCCRYCPCsABQEAFgIfB2c8KwAFAQAWAh8HZxYCZmZkAgsPPCsADQBkAg8PPCsADQEBEBYCAgYCBxYCPCsABQEAFgIfB2c8KwAFAQAWAh8HZxYCZmZkAhMPPCsADQEBEBYBAgkWATwrAAUBABYCHwdnFgFmZAIXDzwrAA0AZAIID2QWAmYPZBYCAgMPPCsADQBkGAcFCWd2RkFUQVdCQQ9nZAUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFCGJ0blF1ZXJ5BQxndkZBVkdIQUFfQU0PZ2QFD2d2RkFURU5WTERldGFpbA9nZAUFZ3ZBTVMPZ2QFCWd2RkFURlNVQQ9nZAUMZ3ZGQVRFTlZMTWF4D2dkngWKmvQSD9ztUEc3/x9UNOGHue0=',
hdn_menu_head_index: '',
p: 'SEARCH',
o: '4',
v: 'root',
r: '2',
currentCalForm: 'dep',
currentdate: '114-04-15',
onload: '',
CCNetInfo1$txtCurrentDate: '',
txtAWBPrefix: '297',
txtAWBNumber: '86097782',
__ASYNCPOST: 'true'
});
post_option.headers = {
'Content-Type' : 'application/x-www-form-urlencoded',
'Content-Length' : post_data.length
};
var post_req = https.request(post_option, function(res){
res.on('data', function(buffer){
console.log(buffer.toString());
});
});
post_req.on('error', function(err){
console.log(err);
});
post_req.write(post_data);
post_req.end();
报错如下:{ [Error: socket hang up] code: 'ECONNRESET', sslError: undefined }
,添加代码post_option.secureOptions = require('constants').SSL_OP_NO_TLSv2;
之后依然报这个错。之前做的http请求都没有问题,就是https怎么弄都不行啊,这是哪儿的问题啊?
在处理HTTPS请求时遇到{ [Error: socket hang up] code: 'ECONNRESET', sslError: undefined }
错误通常是由于网络连接被远程服务器重置或超时引起的。这可能是因为服务器端的问题、网络配置问题或者客户端请求方式不正确。
以下是一些可能的解决方案和调试步骤:
1. 检查URL和请求参数
确保你的URL和请求参数都是正确的。有时候,服务器可能对请求的某些部分有特定的要求。
2. 使用更详细的错误信息
你可以尝试捕获更多的错误信息来帮助诊断问题。例如:
post_req.on('error', function(err) {
console.error('Request error:', err);
});
3. 设置超时时间
有时,请求可能会因为超时而失败。你可以设置一个合理的超时时间来避免这种情况:
var post_req = https.request(post_option, function(res) {
res.on('data', function(buffer) {
console.log(buffer.toString());
});
}).setTimeout(10000, function() { // 设置10秒超时
console.error('Request timed out');
post_req.abort();
});
post_req.on('error', function(err) {
console.error('Request error:', err);
});
4. 使用代理(如果需要)
如果你在防火墙后面,可能需要通过代理服务器发送请求:
var proxyAgent = require('https-proxy-agent');
post_option.agent = new proxyAgent('http://your-proxy-url:port');
示例代码
以下是修改后的完整示例代码:
var https = require('https');
var querystring = require('querystring');
var url = "https://cargo.china-airlines.com/CCNet/pgFreightStatus/cgoTrack.aspx?AWBPrefix=297&AWBNumber=86097782";
var post_option = require('url').parse(url);
post_option.method = 'POST';
post_option.port = 443;
var post_data = querystring.stringify({
ScriptManager1: 'ScriptManager1|btnQuery',
__EVENTTARGET: '',
__EVENTARGUMENT: '',
__VIEWSTATE: '/wEPDwUKMTY2MDI5MzU5MQ9kFgICAw9kFggCAg8PFgQeCkZ1bmNfVGl0bGVlHhBGdW5jX0Rlc2NyaXB0aW9uZWQWCgIBDw8WAh4EVGV4dGVkZAIDDw8WAh8CZGRkAgYPDxYCHwJlFggeC29ubW91c2Vtb3ZlBVl2YXIgZHZIaW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdkhpbnQnKTsgZHZIaW50LmlubmVySFRNTD0nJztTaG93SGludChldmVudCxkdkhpbnQpOx4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYXZhc2NyaXB0OlRpdGxlT25DbGljaygnJywndHh0QVdCUHJlZml4JywndHh0QVdCTnVtYmVyJyk7ZAIHD2QWAmYPZBYEAgMPDxYCHwIFEDE1QXByIDAyOjM0OjI5zi4Kb25tb3VzZW91dAWJAXZhciBkdkhpbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R2SGludCcpOyBkdkhpbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoLyBpbmZvdGl0bGVob3Zlci9nLCAnJyk7HgdvbmNsaWNrBWNqYX
“Error Connection Reset” 我觉着像是请求被服务端关掉了? http://stackoverflow.com/questions/17245881/node-js-econnreset
你试一下用 request 请求一下?
request试过了,还是报同样的错误,代码如下:
var postData={
ScriptManager1: 'ScriptManager1|btnQuery',
__EVENTTARGET: '',
__EVENTARGUMENT: '',
__VIEWSTATE: '...',//太长了,省略
hdn_menu_head_index: '',
p: 'SEARCH',
o: '4',
v: 'root',
r: '2',
currentCalForm: 'dep',
currentdate: '114-04-15',
onload: '',
CCNetInfo1$txtCurrentDate: '',
txtAWBPrefix: '297',
txtAWBNumber: '86097782',
__ASYNCPOST: 'true',
'btnQuery.x': '-1045',
'btnQuery.y': '-195'
};
require(‘request’).post({
uri:“https://cargo.china-airlines.com/CCNet/pgFreightStatus/cgoTrack.aspx? AWBPrefix=297&AWBNumber=86097782”,
headers:{
‘content-type’: ‘application/x-www-form-urlencoded’,
‘User-Agent’: ‘Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)’
},
body:require(‘querystring’).stringify(postData),
secureOptions: require(‘constants’).SSL_OP_NO_TLSv2
},function(err,res,body){
console.log(err);
console.log(body);
console.log(res.statusCode);
});
同样的请求我用java
的HttpClient
是能拿到返回的数据的,是我上面的代码有问题吗?
根据你的描述,错误信息 socket hang up
和 code: 'ECONNRESET'
表明在请求过程中连接被远程服务器重置了。这通常是由于网络问题、服务器端拒绝连接或 SSL/TLS 协议不兼容等原因引起的。
以下是一些可能的解决方案:
1. 检查网络连接
确保你的网络连接稳定,并且没有防火墙或其他网络设备阻止请求。
2. 更新 Node.js 版本
确保你使用的是最新版本的 Node.js,因为旧版本可能存在一些已知的网络连接问题。
3. 使用 agent
选项
有时使用自定义的 agent
可以解决连接问题。你可以尝试使用 http.Agent
或 https.Agent
。
const https = require('https');
const http = require('http');
const url = "https://cargo.china-airlines.com/CCNet/pgFreightStatus/cgoTrack.aspx?AWBPrefix=297&AWBNumber=86097782";
const post_option = require('url').parse(url);
post_option.method = 'POST';
post_option.port = 443;
const post_data = require('querystring').stringify({
// your data here
});
post_option.headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_data)
};
// 使用自定义 agent
const agent = new http.Agent({ rejectUnauthorized: false });
const post_req = https.request(post_option, { agent }, (res) => {
res.on('data', (buffer) => {
console.log(buffer.toString());
});
});
post_req.on('error', (err) => {
console.log(err);
});
post_req.write(post_data);
post_req.end();
4. 调试 SSL/TLS 设置
如果你怀疑 SSL/TLS 设置有问题,可以尝试禁用证书验证(仅用于开发环境)。
const https = require('https');
const url = "https://cargo.china-airlines.com/CCNet/pgFreightStatus/cgoTrack.aspx?AWBPrefix=297&AWBNumber=86097782";
const post_option = require('url').parse(url);
post_option.method = 'POST';
post_option.port = 443;
const post_data = require('querystring').stringify({
// your data here
});
post_option.headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_data)
};
// 禁用证书验证
const options = {
...post_option,
agent: new https.Agent({ rejectUnauthorized: false })
};
const post_req = https.request(options, (res) => {
res.on('data', (buffer) => {
console.log(buffer.toString());
});
});
post_req.on('error', (err) => {
console.log(err);
});
post_req.write(post_data);
post_req.end();
请注意,禁用证书验证仅适用于开发环境,生产环境中应保持证书验证以确保安全性。