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。 望高人指导!!!!


3 回复

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,但在某些情况下,这可能不足以解决问题。

解决方案

  1. 增加系统缓冲区大小:可以通过修改操作系统配置来增加系统缓冲区大小。但这通常是临时解决方案,并且需要管理员权限。

  2. 优化代码逻辑:确保每次请求后正确关闭连接。可以使用 http.request 方法并在回调中处理响应。

  3. 使用流式传输数据:通过流式传输数据可以减少内存占用,从而避免缓冲区溢出问题。

以下是一个改进后的示例代码:

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();

解释

  1. 解析 URL:使用 URL 对象解析目标地址。
  2. 创建请求选项:设置主机名、端口、路径、方法等。
  3. 发起请求:使用 http.request 方法发起 POST 请求。
  4. 处理响应:在响应事件中收集数据并输出。
  5. 错误处理:捕获请求过程中的错误。
  6. 流式传输数据:使用 req.write 方法发送数据,然后调用 req.end() 完成请求。

通过这种方式,你可以更有效地管理连接和数据传输,减少内存占用,从而避免 ENoBUFS 错误。


这个讨论和你的情况相近。估计你开的请求太多,用async限制一下,别一次有太多请求。 https://github.com/joyent/node/issues/3269

ENOBUFS 错误通常是由于系统缓冲区不足导致的。在较旧的 Node.js 版本(如0.10.32)中,这种问题可能会比较常见。这里有一些可能的解决方案:

  1. 升级 Node.js:将你的 Node.js 升级到最新稳定版本。较新的版本通常有更好的性能和更多的修复。

  2. 增加文件描述符限制:在 Windows XP 中,可能需要增加文件描述符的限制。你可以尝试通过修改系统设置来实现这一点。

  3. 优化代码:确保你在发送请求时没有创建过多的未关闭连接。这可能导致资源耗尽。

  4. 使用 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();

确保你正确处理了所有事件,并且在请求完成后正确关闭连接。如果问题仍然存在,可以考虑升级系统或寻找其他替代方案。

回到顶部