我有这个函数,下面传递给这个函数的数据返回一个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);
});
});
}
]}`
答案 0 :(得分:7)
我遇到了同样的问题,并且能够通过添加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代码中有些奇怪。也许你甚至可以把它称为bug,但我不确定;)
PS:我对这个问题的原因有更多的了解。如果您有任何想法,请发表评论......
答案 1 :(得分:0)
这可能是系统的原因,而不是编程问题。
答案 2 :(得分:0)
当您更改响应内容时,您还需要在标题上更新内容长度:
headers: {
...
'Content-Length': Buffer.byteLength(post_data),
...
}
但是,当我尝试发出多个请求时,我也遇到了这个问题,并且似乎在不同的库上管理得不好,所以我发现如果这个问题仍然存在的解决方法是添加标题:
headers: {
...
connection: 'Close'
...
}
因此,如果您在不同的服务器上发出请求,请在完成此过程后关闭连接。这对我来说是net,node-http-proxy。