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怎么弄都不行啊,这是哪儿的问题啊?


6 回复

在处理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); });

同样的请求我用javaHttpClient是能拿到返回的数据的,是我上面的代码有问题吗?

根据你的描述,错误信息 socket hang upcode: 'ECONNRESET' 表明在请求过程中连接被远程服务器重置了。这通常是由于网络问题、服务器端拒绝连接或 SSL/TLS 协议不兼容等原因引起的。

以下是一些可能的解决方案:

1. 检查网络连接

确保你的网络连接稳定,并且没有防火墙或其他网络设备阻止请求。

2. 更新 Node.js 版本

确保你使用的是最新版本的 Node.js,因为旧版本可能存在一些已知的网络连接问题。

3. 使用 agent 选项

有时使用自定义的 agent 可以解决连接问题。你可以尝试使用 http.Agenthttps.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();

请注意,禁用证书验证仅适用于开发环境,生产环境中应保持证书验证以确保安全性。

回到顶部