nodejs错误:parsingSocket.ondata错误

使用http.request发出客户端请求(node v0.6.18,v0.6.3)时,出现了一些错误,下面的代码会产生错误,并且我有一些问题。

var http = require('http'); var url = require('url'); http.createServer(function(req, res) { var data = '多情自古空余恨'; res.writeHead(200, { 'Content-Type': 'text/plain', 'Content-Length': 1 //ERROR }); res.end(data); }).listen(3000); function request(options, callback) { var req = http.request(options, function(res) { var data = ''; res.setEncoding = 'utf8'; res.on('data', function(chunk) { data += chunk; }); res.on('error', function(err) { callback(new Error('res error: ' + err)); }); res.on('end', function() { console.log('res on end'); callback(null, data); }); }); req.on('socket', function(socket) { socket.on('error', function(err) { console.log('socket on error'); callback('socket error: ' + err); req.abort(); }); }); req.end(); } request({ host: 'localhost', port: 3000, method: 'GET' }, function(err, data) { console.log('result, err: ' + err + ', data: ' + data); }); 

输出:

 res on end result, err: null, data:   socket on error result, err: socket error: Error: Parse Error, data: undefined 

这是我的问题:

  1. 为什么res的'结束'事件发生在套接字的“错误”事件之前?
  2. 如果我想callback一个错误,当“parsing错误在Socket.ondata”发生像上面的代码或在任何其他情况下,如何callback一次,而不是上述输出的两倍(如果水库的'结束'事件真的早于套接字的“错误”事件)?

我需要你的帮助! 谢谢。

===============================

我发现了相同的代码输出:

 res on end result, err: null, data:   

在节点v0.6.6和v0.6.11中。 为什么?

因为有一个内容长度为1的头,当request收到正好1个八位字节的数据时,它假定所有的都有,并且触发endcallback。 之后,会收到更多的数据,表示套接字不知道如何处理,所以会引发错误。

为了解决这个问题,你可能需要等待一段时间,然后才能成功callback,并追踪是否被解雇。 例如:

 var req = http.request(options, function(res) { var data = ''; res.setEncoding = 'utf8'; res.on('data', function(chunk) { data += chunk; }); res.on('error', function(err) { if(!callback.called) { // check before firing the callback callback(new Error('res error: ' + err)); callback.called = true; // set after firing the callback } // .. }); res.on('end', function() { process.nextTick(function() { // use setTimeout if nextTick is too short if(!callback.called) { //.. console.log('res on end'); callback(null, data); callback.called = true; // .. } // .. }); // .. }); }); req.on('socket', function(socket) { socket.on('error', function(err) { if(!callback.called) { // .. console.log('socket on error'); callback('socket error: ' + err); callback.called = true; // .. } // .. req.abort(); }); }); req.end(); 

(为了使它们脱颖而出,我尝试在所有的新行之后添加注释。)