Nodejs跨站请求返回错误 { [Error: socket hang up] code: 'ECONNRESET' }

Nodejs跨站请求返回错误 { [Error: socket hang up] code: ‘ECONNRESET’ }

需要向其它服务器get和post数据,类似以这样的方式:

var req = require('request');
var qs  = require('querystring');
var data = {
    key1 : value1,
    key2 : value2,
};
var url = "http://other-domain.com/part";
req.get( url + "?" + qs.stringify( data ), {}, function( err, res, body ){
    console.log( err );
});
req.post( url, data, function( err, res, body ){
    console.log( err );
});

但每次都返回错误:{ [Error: socket hang up] code: ‘ECONNRESET’ }

求大神搭救!


8 回复

需要向其它服务器get和post数据,类似以这样的方式:

var req = require('request');
var qs  = require('querystring');
var data = {
    key1 : value1,
    key2 : value2,
};
var url = "http://other-domain.com/part";
req.get( url + "?" + qs.stringify( data ), {}, function( err, res, body ){
    console.log( err );
});
req.post( url, data, function( err, res, body ){
    console.log( err );
});

但每次都返回错误:{ [Error: socket hang up] code: ‘ECONNRESET’ } 求大神搭救!


var url = “http://other-domain.com/part”;

这一行有问题,应该写成:“other-domain.com/part

根本就不需要 http://

Node.js 跨站请求返回错误 { [Error: socket hang up] code: 'ECONNRESET' }

当你在使用 Node.js 发起跨站请求时,可能会遇到 socket hang up 错误。这种错误通常表示请求被远程服务器关闭了连接。这可能是由于多种原因引起的,比如网络问题、服务器超时或服务器配置问题等。

示例代码及解释

以下是一个改进后的示例代码,展示了如何使用 axios 进行跨站请求,并添加了错误处理机制:

const axios = require('axios');

const data = {
    key1: 'value1',
    key2: 'value2',
};

const url = 'http://other-domain.com/part';

// GET 请求
axios.get(url, {
    params: data // 将参数作为查询字符串传递
})
.then(response => {
    console.log('GET Response:', response.data);
})
.catch(error => {
    if (error.response) {
        // 服务器响应了,但是状态码不是 2xx
        console.error('GET Error Status:', error.response.status);
        console.error('GET Error Data:', error.response.data);
    } else if (error.request) {
        // 请求已发送,但没有收到响应
        console.error('GET Request Error:', error.request);
    } else {
        // 捕获设置请求时发生的错误
        console.error('GET Error Message:', error.message);
    }
});

// POST 请求
axios.post(url, data)
.then(response => {
    console.log('POST Response:', response.data);
})
.catch(error => {
    if (error.response) {
        // 服务器响应了,但是状态码不是 2xx
        console.error('POST Error Status:', error.response.status);
        console.error('POST Error Data:', error.response.data);
    } else if (error.request) {
        // 请求已发送,但没有收到响应
        console.error('POST Request Error:', error.request);
    } else {
        // 捕获设置请求时发生的错误
        console.error('POST Error Message:', error.message);
    }
});

解释

  1. 使用 axios

    • axios 是一个流行的 HTTP 客户端库,用于发起 HTTP 请求。
    • 它提供了更强大的功能和更好的错误处理机制,比 request 库更易于使用和维护。
  2. GET 请求

    • 使用 axios.get() 方法发起 GET 请求。
    • 参数通过 params 选项传递,这样它们会被自动转换为查询字符串。
  3. POST 请求

    • 使用 axios.post() 方法发起 POST 请求。
    • 数据直接作为第二个参数传递。
  4. 错误处理

    • 使用 .catch() 方法捕获错误。
    • 通过检查 error.responseerror.request 来区分不同的错误类型。
    • 如果请求成功但响应状态码不正确(非 2xx),则会在 error.response 中找到相关信息。
    • 如果请求本身存在问题,则会在 error.request 中找到相关信息。

通过这种方式,你可以更好地调试和处理跨站请求中出现的 socket hang up 错误。

奇怪, 我一直以为 POST 是不能跨域的… 求助 3 楼

当TCP协议接收到RST数据段,表示连接出现了某种错误,函数read将以错误返回,错误类型为ECONNERESET。

参考这里: 1、 http://z-redsky.blog.163.com/blog/static/44986162201110121020387/ 2、 http://stackoverflow.com/questions/2974021/what-does-econnreset-mean-in-the-context-of-an-af-local-socket

貌似被GFW屏蔽了的网站也会出现”连接被重置“的错误。 先检查一下那个url能否用浏览器正常打开,再进一步排除原因。

如何解决这个问题呢?楼主有正解了么

楼主这个问题解决了么

在使用 Node.js 发起跨站请求时遇到 { [Error: socket hang up] code: 'ECONNRESET' } 错误,通常是因为请求被远程服务器主动关闭了连接。这可能是由于多种原因导致的,例如网络问题、远程服务器超时设置或请求负载过大。

为了解决这个问题,可以尝试增加请求超时时间或者使用更稳定的库(如 axios 或者 node-fetch)。这里我将展示如何使用 axios 来解决此问题:

首先,你需要安装 axios

npm install axios

然后,你可以修改你的代码来使用 axios

const axios = require('axios');

const data = {
    key1 : value1,
    key2 : value2,
};

const url = "http://other-domain.com/part";

// GET 请求
axios.get(url, {
    params: data,
    timeout: 10000 // 设置请求超时时间为 10 秒
})
.then(response => {
    console.log(response.data);
})
.catch(error => {
    if (error.code === 'ECONNRESET') {
        console.error("请求超时或连接被重置,请检查网络或服务器配置");
    } else {
        console.error(error);
    }
});

// POST 请求
axios.post(url, data, {
    timeout: 10000 // 设置请求超时时间为 10 秒
})
.then(response => {
    console.log(response.data);
})
.catch(error => {
    if (error.code === 'ECONNRESET') {
        console.error("请求超时或连接被重置,请检查网络或服务器配置");
    } else {
        console.error(error);
    }
});

通过这种方式,你可以更好地处理超时问题,并且得到更加详细的错误信息,从而更容易地定位和解决问题。如果仍然遇到问题,建议检查远程服务器的配置和日志,确保它能够正确处理请求。

回到顶部