Nodejs HTTP 请求跑着跑着就没有响应了,又遇到的没?
Nodejs HTTP 请求跑着跑着就没有响应了,又遇到的没?
var https = require(‘https’);
var options = { host: ‘open.t.qq.com’, port: 443, path: ‘/api/t/re_add’, method: ‘POST’ };
var post_data = ‘oauth_consumer_key=801243043&access_token=273f8fbb38254ef6f5519a2b88aa1bba&openid=a87980a620fdd44b54aa84a029b18654&clientip=127.0.0.1&oauth_version=2.a&scope=all&format=json&reid=273009086234102&content=imax_checkfHQsnMQaq’
var req = http.request(options, function(res) { console.log('STATUS: ’ + res.statusCode); res.on(‘data’, function (chunk) { console.log('BODY: ’ + chunk); }); });
req.on(‘error’, function(e) { console.log('problem with request: ’ + e.stack); res.end(‘error’); });
// write data to request body req.write(post_data); req.end();
代码如上所示, 定时并发调用这个去腾讯请求数据,一开始请求返回没有问题,但是过一段时间之后就,data事件就再也收不到消息了。有人遇到过没,也没有error事件。不知道是没法出去还是没响应。在linux下同一个环境curl发同样的请求却能够返回正确结果,重启下也能返回结果,但过一段时间又会出现同样的问题。 tencent开放平台的很多接口都有这个问题。 球大神破解。
根据你的描述,你的Node.js程序在进行HTTP请求时会突然停止响应,并且data
事件不再触发,同时也没有触发error
事件。这可能是由于一些常见的问题导致的,比如超时、内存泄漏、或请求配置不当等。
可能的原因及解决方法
- 超时问题:默认情况下,Node.js HTTP客户端不会设置超时时间。如果服务器响应时间较长,可能会导致请求挂起。
- 错误处理不当:可能有未捕获的错误,导致请求无法正常完成。
- 资源管理不当:长时间运行的应用程序可能会消耗过多资源,导致性能下降。
示例代码与改进
为了更好地处理这些情况,你可以考虑以下几点:
- 设置请求超时时间
- 改进错误处理逻辑
- 确保资源被正确释放
以下是改进后的代码示例:
const https = require('https');
const options = {
host: 'open.t.qq.com',
port: 443,
path: '/api/t/re_add',
method: 'POST',
timeout: 10000 // 设置10秒超时
};
const post_data = 'oauth_consumer_key=801243043&access_token=273f8fbb38254ef6f5519a2b88aa1bba&openid=a87980a620fdd44b54aa84a029b18654&clientip=127.0.0.1&oauth_version=2.a&scope=all&format=json&reid=273009086234102&content=imax_checkfHQsnMQaq';
const req = https.request(options, (res) => {
console.log('STATUS: ' + res.statusCode);
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('BODY: ' + data);
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// 写入请求体
req.write(post_data);
// 结束请求
req.end();
关键点解释
- 超时设置:通过在
options
对象中添加timeout
属性,可以设置请求的最大等待时间(以毫秒为单位)。 - 错误处理:使用
req.on('error', ...)
来捕捉任何请求过程中发生的错误。 - 数据收集:使用一个变量
data
来累积所有从data
事件接收到的数据片段,并在end
事件触发时打印完整数据。
以上改进可以帮助你更好地处理请求过程中的异常情况,确保应用程序稳定运行。
说明一下跑的环境,怎么跑的
明显是开发平台的对于采集的一种防御?
var https = require('https');
................
var req = http.request(options, function(res) {
上面2句对不上,究竟用的http协议还是https协议。另外,程序生成http请求不符合http规范,header缺少Content-Type,最好也指定Content-Length。修改如下
var https = require('https');
var post_data = 'oauth_consumer_key=801243043&access_token=273f8fbb38254ef6f5519a2b88aa1bba&openid=a87980a620fdd44b54aa84a029b18654&clientip=127.0.0.1&oauth_version=2.a&scope=all&format=json&reid=273009086234102&content=imax_checkfHQsnMQaq'
var options = {
host: 'open.t.qq.com',
port: 443,
path: '/api/t/re_add',
method: 'POST',
headers:{
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':post_data.length
}
};
var req = https.request(options, function(res) {
console.log('STATUS: ' + res.statusCode);
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function(e) {
console.log('problem with request: ' + e.stack);
res.end('error');
});
req.write(post_data);
req.end();
输出
STATUS: 200
BODY: {"data":{"id":"270003082809897","time":1363962771},"errcode":0,"msg":"ok","ret":0,"seqid":5858208050260679447}
我也遇到了这个问题,我是跟tomcat交互 大概发了3000多个请求之后就挂了
根据你的描述,HTTP请求在运行一段时间后不再响应,并且没有触发错误事件。这种情况可能是由于以下几个原因导致的:
-
连接池耗尽:如果你的应用频繁发起HTTP请求,可能会耗尽可用的连接。Node.js默认使用的是
agent
来管理HTTP连接,可以通过设置agent
为false
来禁用这种机制,强制每次请求都创建一个新的连接。 -
超时设置:如果服务器端处理时间较长或者网络不稳定,请求可能不会立即收到响应。可以通过设置
setTimeout
来处理这种情况。 -
资源泄漏:检查是否有未关闭的资源(如文件、数据库连接等),这可能导致内存泄漏或其它资源泄露,从而影响到HTTP请求。
下面是一个改进后的代码示例,加入了连接配置和超时设置:
const https = require('https');
const options = {
host: 'open.t.qq.com',
port: 443,
path: '/api/t/re_add',
method: 'POST',
agent: false, // 禁用连接池
timeout: 10000 // 设置10秒超时
};
const post_data = 'oauth_consumer_key=801243043&access_token=273f8fbb38254ef6f5519a2b88aa1bba&openid=a87980a620fdd44b54aa84a029b18654&clientip=127.0.0.1&oauth_version=2.a&scope=all&format=json&reid=273009086234102&content=imax_checkfHQsnMQaq';
const req = https.request(options, (res) => {
console.log('STATUS: ' + res.statusCode);
let responseBody = '';
res.on('data', (chunk) => {
responseBody += chunk;
});
res.on('end', () => {
console.log('BODY: ' + responseBody);
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// 写入数据到请求体
req.write(post_data);
// 结束请求
req.end();
上述代码通过设置agent: false
来禁用连接池,并通过timeout
属性来设置请求超时时间。你可以根据实际情况调整这些参数,以确保请求的稳定性。