gpt4 book ai didi

javascript - nodejs 错误 : Parse Error at Socket. ondata

转载 作者:搜寻专家 更新时间:2023-10-31 22:50:57 27 4
gpt4 key购买 nike

我在使用 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 的 'end' 事件比 socket 的 'error' 事件发生得早?
  2. 如果我确实想在“Parse Error at Socket.ondata”发生时像上面的代码或在任何其他情况下回调错误,如何像上面的输出那样回调一次而不是两次(如果 res 的 'end' 事件真的比套接字的“错误”事件更早发生)?

我需要你的帮助!谢谢。

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

我发现相同的代码输出:

res on end
result, err: null, data: �

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

最佳答案

因为有一个内容长度为 1 的 header ,当 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();

(我试图在所有新行之后添加注释,使它们突出一点。)

关于javascript - nodejs 错误 : Parse Error at Socket. ondata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10838186/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com