Nodejs 关于HTTP require post数据报ENOBUFS错误
Nodejs 关于HTTP require post数据报ENOBUFS错误
采用post方式将报文提交到后台,提交参数设置为: var options = { host:parse_u.hostname, port:parse_u.port || (isHttp ? 80 : 443), path:parse_u.path, method:“POST”, agent:false, headers:{ “Content-Type”:“application/x-www-form-urlencoded”, “Content-Length”:Buffer.byteLength(content, ‘utf8’) } }; 已经将agent设置为false,但是过一段时间还是用报ENOBUFS错误,重启应用还是会报这个错误,必须重启电脑。 环境:系统XP,Node版本0.10.32。 望高人指导!!!!
Node.js 关于HTTP 请求 POST 数据报 ENOBUFS 错误
问题描述
在使用 Node.js 进行 HTTP POST 请求时,遇到 ENoBUFS
错误。即使已经将 agent
设置为 false
,过一段时间后仍然会报这个错误。重启应用后依旧存在该问题,必须重启计算机才能解决。
环境
- 操作系统:Windows XP
- Node.js 版本:0.10.32
原因分析
ENoBUFS
错误通常表示系统缓冲区已满。在 Node.js 中,这可能是由于 TCP 连接过多或网络资源不足导致的。尽管你已经将 agent
设置为 false
,但在某些情况下,这可能不足以解决问题。
解决方案
-
增加系统缓冲区大小:可以通过修改操作系统配置来增加系统缓冲区大小。但这通常是临时解决方案,并且需要管理员权限。
-
优化代码逻辑:确保每次请求后正确关闭连接。可以使用
http.request
方法并在回调中处理响应。 -
使用流式传输数据:通过流式传输数据可以减少内存占用,从而避免缓冲区溢出问题。
以下是一个改进后的示例代码:
const http = require('http');
// 解析 URL
const parse_u = new URL('http://example.com/api');
const isHttp = parse_u.protocol === 'http:';
const content = 'your-post-data-here';
const options = {
host: parse_u.hostname,
port: parse_u.port || (isHttp ? 80 : 443),
path: parse_u.pathname,
method: 'POST',
agent: false,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(content, 'utf8')
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
// 使用流式传输数据
req.write(content);
req.end();
解释
- 解析 URL:使用
URL
对象解析目标地址。 - 创建请求选项:设置主机名、端口、路径、方法等。
- 发起请求:使用
http.request
方法发起 POST 请求。 - 处理响应:在响应事件中收集数据并输出。
- 错误处理:捕获请求过程中的错误。
- 流式传输数据:使用
req.write
方法发送数据,然后调用req.end()
完成请求。
通过这种方式,你可以更有效地管理连接和数据传输,减少内存占用,从而避免 ENoBUFS
错误。
这个讨论和你的情况相近。估计你开的请求太多,用async限制一下,别一次有太多请求。 https://github.com/joyent/node/issues/3269
ENOBUFS 错误通常是由于系统缓冲区不足导致的。在较旧的 Node.js 版本(如0.10.32)中,这种问题可能会比较常见。这里有一些可能的解决方案:
-
升级 Node.js:将你的 Node.js 升级到最新稳定版本。较新的版本通常有更好的性能和更多的修复。
-
增加文件描述符限制:在 Windows XP 中,可能需要增加文件描述符的限制。你可以尝试通过修改系统设置来实现这一点。
-
优化代码:确保你在发送请求时没有创建过多的未关闭连接。这可能导致资源耗尽。
-
使用
http.request
而不是http.get
:如果你正在使用http.get
方法,改用http.request
可能会有所帮助。
以下是改进后的示例代码,使用 http.request
方法:
const http = require('http');
const parse_u = require('url').parse('http://example.com/path');
let content = 'your data here'; // 替换为你的实际数据
var options = {
host: parse_u.hostname,
port: parse_u.port || (parse_u.protocol === 'http:' ? 80 : 443),
path: parse_u.path,
method: 'POST',
agent: false,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(content, 'utf8')
}
};
const req = http.request(options, (res) => {
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`Response: ${chunk}`);
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
// 写入数据到请求主体
req.write(content);
req.end();
确保你正确处理了所有事件,并且在请求完成后正确关闭连接。如果问题仍然存在,可以考虑升级系统或寻找其他替代方案。