Bor*_*ris 5 javascript sockets http node.js
我在使用http.request发出客户端请求时遇到了一些错误(节点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);
});
Run Code Online (Sandbox Code Playgroud)
输出:
res on end
result, err: null, data: ?
socket on error
result, err: socket error: Error: Parse Error, data: undefined
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
我需要你的帮助!谢谢.
===============================
我找到了相同的代码输出:
res on end
result, err: null, data: ?
Run Code Online (Sandbox Code Playgroud)
在节点v0.6.6和v0.6.11中.为什么?
由于内容长度标头为 1,因此当request接收到正好 1 个八位字节的数据时,它会假定这就是全部数据并触发回调end。之后,接收到更多数据,套接字不知道如何处理,因此会引发错误。
要解决此问题,您也许可以等待一小段时间,然后再触发回调以确保成功,并跟踪它是否已被触发。例如:
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();
Run Code Online (Sandbox Code Playgroud)
(我尝试在所有新行之后添加注释,以使它们更加突出。)
| 归档时间: |
|
| 查看次数: |
4511 次 |
| 最近记录: |