Nodejs https.request 出现异常[Error: connect ECONNREFUSED]

Nodejs https.request 出现异常[Error: connect ECONNREFUSED]

用https.request模拟post请求出现异常:

 { [Error: connect ECONNREFUSED],code: 'ECONNREFUSED',  errno: 'ECONNREFUSED', syscall: 'connect' } 

代码如下:

var https=require("https");
var querystring=require("querystring"); 
var contents=querystring.stringify({
    password:"1213mzl",
    identity:"15989492323",
    token:"1cb42f5d9df6f9d468ffb755723149c1"
});
var options={
    host:"shenzhen.baixing.com",  
    path:"/oz/login/x",  
    method:"post",
    headers:{
        "Content-Type":"application/x-www-form-urlencoded",  
        "Content-Length":contents.length,         
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",     
        "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6",  
        "Cache-Control":"max-age=0",  
        "Connection":"keep-alive",    
        "Host":"shenzhen.baixing.com",  
        "Referer":"http://shenzhen.baixing.com/oz/login/x",         
        "User-Agent":"Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko)"  
    }  
};
var request=https.request(options,function(res){      
    res.setEncoding("utf8");
    res.on("data",function(data){  
        console.log("data:"+data);  
    });
});
request.on('error', function (err) {
    console.log(err);
});
request.write(contents);
request.end();

请大侠帮帮忙,如何解决。

6 回复

根据你提供的信息,错误 ECONNREFUSED 表明你的 Node.js 应用尝试连接到服务器时,服务器拒绝了连接。这通常意味着目标服务器没有运行或目标端口未开放。

以下是一些可能的解决方案和调试步骤:

1. 确认服务器地址和端口

首先确保你提供的主机名和路径是正确的,并且该服务正在监听指定的端口。对于 HTTPS 请求,默认端口是 443。

2. 使用正确的库

由于你使用的是 HTTPS 请求,应该确保使用 https 模块而不是 http 模块。你的代码中已经正确地使用了 https 模块。

3. 调试和日志

添加更多的日志输出以确认请求的详细信息。例如,打印 options 对象来确保所有参数都是正确的。

示例代码和调试

var https = require("https");
var querystring = require("querystring");

// 构建 POST 数据
var contents = querystring.stringify({
    password: "1213mzl",
    identity: "15989492323",
    token: "1cb42f5d9df6f9d468ffb755723149c1"
});

// 设置请求选项
var options = {
    host: "shenzhen.baixing.com",
    path: "/oz/login/x",
    method: "POST",
    headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Content-Length": Buffer.byteLength(contents),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
        "Cache-Control": "max-age=0",
        "Connection": "keep-alive",
        "Host": "shenzhen.baixing.com",
        "Referer": "http://shenzhen.baixing.com/oz/login/x",
        "User-Agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko)"
    }
};

console.log("Options:", options); // 打印选项以进行调试

// 发送请求
var request = https.request(options, function (res) {
    res.setEncoding("utf8");
    res.on("data", function (data) {
        console.log("Response data:", data);
    });
});

request.on('error', function (err) {
    console.error("Request error:", err.message);
});

// 发送 POST 数据
request.write(contents);

// 结束请求
request.end();

进一步检查

  • 网络问题:确保你的网络连接正常,可以访问外部网络。
  • 防火墙或代理:检查是否有防火墙或代理阻止了请求。
  • 服务器状态:确保目标服务器正在运行,并且能够处理来自你的 IP 地址的请求。

通过这些步骤,你应该能够更好地理解并解决 ECONNREFUSED 错误。如果问题仍然存在,可能需要联系服务器管理员或检查是否有其他安全设置阻止了你的请求。


人家做了防爬?

ECONNREFUSED 一般是 TCP 握手都没成功,如果第一次就是这样,可能是你地址或者端口填错了;如果一段时间之后变成这样,有可能是你被对方封掉了。

tcpdump看下流程

连接被丢弃了.

出现 ECONNREFUSED 错误通常表示你的请求无法连接到指定的服务器。这可能是因为服务器未运行、端口不正确或防火墙阻止了连接。以下是一些可能的解决方案:

检查服务器是否运行

确保 shenzhen.baixing.com 是一个可访问的地址,并且服务器正在监听请求。

检查端口

默认情况下,HTTPS 请求使用 443 端口。确认你请求的路径中使用的端口是正确的。

检查网络设置

确保没有防火墙或代理阻止连接。

示例代码调整

var https = require("https");
var querystring = require("querystring");

var contents = querystring.stringify({
    password: "1213mzl",
    identity: "15989492323",
    token: "1cb42f5d9df6f9d468ffb755723149c1"
});

var options = {
    hostname: "shenzhen.baixing.com",  // 使用 `hostname` 而不是 `host`
    port: 443,                        // 明确指定端口
    path: "/oz/login/x",
    method: "POST",
    headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Content-Length": contents.length,
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
        "Cache-Control": "max-age=0",
        "Connection": "keep-alive",
        "Host": "shenzhen.baixing.com",
        "Referer": "http://shenzhen.baixing.com/oz/login/x",
        "User-Agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko)"
    }
};

var request = https.request(options, function (res) {
    res.setEncoding("utf8");
    res.on("data", function (data) {
        console.log("Response:", data);
    });
});

request.on('error', function (err) {
    console.error("Request error:", err);
});

request.write(contents);
request.end();

关键修改点

  1. 使用 hostname 替代 host:虽然两者功能相同,但建议统一使用 hostname
  2. 明确指定 port 为 443:确保连接到 HTTPS 默认端口。
  3. 错误处理:在 request.on('error') 中输出错误信息,以便调试。

通过以上步骤,你应该能够找到并解决连接被拒绝的问题。如果问题仍然存在,请检查服务器的日志以获取更多信息。

回到顶部