【问题标题】:How to resolve NODE.Js HTTP POST "ECONNRESET" Error如何解决 NODE.Js HTTP POST“ECONNRESET”错误
【发布时间】:2013-11-17 14:21:51
【问题描述】:

我有这个函数,下面传递给这个函数的数据返回一个ECONNRESET,套接字挂起错误。但是,当 discountCode 数组减少到只有 10 个对象时,它可以毫无问题地 POST。

此问题的原因可能是什么?我尝试通过对 Buffer 中的数据进行分段来执行多个 req.write(),但是效果不佳。任何 NodeJs 忍者都可以对这个问题提供一些见解吗?

createObj: function(data, address, port, callback) {

//console.log('Create Reward: '+JSON.stringify(data));
var post_data = JSON.stringify(data);

var pathName = '/me/api/v1/yyy/'+data.idBusinessClient+'/newObj';

    // 
    var options = {
        hostname: address,
        port: port,
        path: pathName,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Accept': 'application/json',
            'Accept-Encoding': 'gzip,deflate,sdch',
            'Accept-Language': 'en-US,en;q=0.8'
        }
    };

    // http call to REST API server
    var req = restHttp.request(options, function(res) {

        console.log('HTTP API server PUT Reward response received.');
        var resData = '';
        res.on('data', function(replyData) {

            // Check reply data for error.
            console.log(replyData.toString('utf8'));
            if(replyData !== 'undefined')
                resData += replyData;
        });

        res.on('end', function() {
            //<TODO>Process the data</TODO>             
            callback(JSON.parse(resData));
        });
    });

    req.write(post_data);
    req.end();

    console.log('write end');

    req.on('close', function() {
        console.log('connection closed!');
    });

    req.on('error', function(err) {
        console.log('http request error : '+err);
        callback({'error':err});
        throw err;
    });

    req.on('socket', function(socket) {
        console.log('socket size:'+socket.bufferSize);
        socket.on('data', function(data) {
            console.log('socket data:'+data);
        });
    });

}

]}`

【问题讨论】:

  • ECONNRESET 表示服务器由于某种原因关闭了连接。也许它不接受这么多的数据?它是自己编写的服务器 API 还是有文档可用的东西?
  • 是的,它是一个使用 Java Spring 框架自己编写的服务器 API。仍在寻找它拒绝数据的原因。你有什么你能想到的想法吗? ;)
  • 你能在标题中添加一个代理:Mozilla 和连接:保持活动吗?

标签: javascript json node.js http


【解决方案1】:

我遇到了同样的问题,并且能够通过添加 Content-Length 标头来解决它:

    headers: {
        'Content-Type': 'application/json; charset=utf-8',
        'Content-Length': Buffer.byteLength(post_data),
        'Accept': 'application/json',
        'Accept-Encoding': 'gzip,deflate,sdch',
        'Accept-Language': 'en-US,en;q=0.8'
    }

但是,我仍然不清楚为什么缺少 Content-Length 标头会导致这样的麻烦。我认为这是内部 Node.js 代码中的某种奇怪之处。也许您甚至可以称其为错误,但我不确定;)

PS:我对有关此问题原因的更多信息非常感兴趣。因此,如果您有任何想法,请发表评论...

【讨论】:

  • 这个错误发生在我用豹纹mac测试的时候。但是,当我用较新的机器对其进行测试时,对我来说不再存在此类问题。它没有出现在我的目标机器上。所以我也和你一样困惑:o
  • 我遇到了同样的问题。我试过你的解决方案,它有效!我不知道为什么,如果你有任何想法,请告诉我。谢谢。
  • 我的与请求中的端口有关。为 SSL 尝试了 443,但它不喜欢它。
【解决方案2】:

当您确定更改响应的内容时,您还需要更新标题的内容长度:

headers: {
    ...
    'Content-Length': Buffer.byteLength(post_data),
    ...
}

但是当我尝试发出多个请求时,我也遇到了这个问题,并且似乎这在不同的库上没有得到很好的管理,所以如果这个问题仍然存在,我发现一个解决方法是添加标题:

headers: {
    ...
    connection: 'Close'
    ...
}

因此,如果您在不同的服务器上发出请求.. 这会在完成该过程后关闭连接。这在网络 node-http-proxy 中对我有用。

【讨论】:

    【解决方案3】:

    如果使用Expresshttp-proxy-middleware 进行POST 调用,并且使用了诸如express.json() 之类的一些主体解析器中间件,则必须使用请求拦截器fixRequestBodymore info)。否则 POST 调用将挂起并出现 ECONNRESET 错误。

    const express = require('express');
    const { createProxyMiddleware, fixRequestBody } = require('http-proxy-middleware');
    
    const app = express();
    app.use(express.json());
    app.post(
      '/path',
      createProxyMiddleware('/path', {
        target: API_URL,
        changeOrigin: true,
        pathRewrite: (path, req) => `/something/${req?.body?.someParameter}`,
        onProxyReq: fixRequestBody // <- Add this line
      });
    

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 2014-01-24
      • 2021-10-26
      • 2021-01-25
      • 2021-01-21
      • 1970-01-01
      • 2013-06-19
      相关资源
      最近更新 更多