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’ }
求大神搭救!
需要向其它服务器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’ } 求大神搭救!
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);
}
});
解释
-
使用
axios
库:axios
是一个流行的 HTTP 客户端库,用于发起 HTTP 请求。- 它提供了更强大的功能和更好的错误处理机制,比
request
库更易于使用和维护。
-
GET 请求:
- 使用
axios.get()
方法发起 GET 请求。 - 参数通过
params
选项传递,这样它们会被自动转换为查询字符串。
- 使用
-
POST 请求:
- 使用
axios.post()
方法发起 POST 请求。 - 数据直接作为第二个参数传递。
- 使用
-
错误处理:
- 使用
.catch()
方法捕获错误。 - 通过检查
error.response
和error.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);
}
});
通过这种方式,你可以更好地处理超时问题,并且得到更加详细的错误信息,从而更容易地定位和解决问题。如果仍然遇到问题,建议检查远程服务器的配置和日志,确保它能够正确处理请求。