2015-04-17 2 views
0

Что делать, если кто-то отправляет запрос GET с телом или запрос POST, но без тела. В обоих случаях мне еще нужно определить событие «данные»?Node.js Должен ли я определять событие «данные» для запросов GET?

request.on ("data", function (chunk) { 
 

 
    // Might be a GET request or whatever. 
 
    // Doesn't get fired when there is no body, 
 
    // but must be present otherwise on "end" doesn't get fired 
 

 
}); 
 

 
request.on ("end", function() { 
 

 
    // Doesn't get fired unless on "data" is present 
 
    // even if there is no body 
 

 
});

Спасибо.

+0

Что это приложение? Используете ли вы экспресс или какую-либо другую структуру или чисто узел? – tpie

+0

Просто чистый узел. Я пытаюсь понять, как поток действительно работает и не может ничего понять в документах. –

+0

Узел довольно низкий на своем собственном уровне. Что выражается в 10 строках, вам придется писать всевозможные вещи ... – tpie

ответ

0

После ряда экспериментов, по-видимому определяющих request.on («данные», обратный вызов) не повредит. Я попробовал несколько вредоносных запросов, и Node.js, по-видимому, справится с ними.

Однако, если запрос GET и клиент пытается отправить тело, основной поток Node бесшумно прерывает соединение с ECONNRESET. События запрос «ошибка» и ответ «финиш» не уволятся. Это, на мой взгляд, неверно. Я ожидал, что смогу сделать что-то вроде регистрации запроса, особенно, если это злонамеренный.

Если запрос POST, но клиент никогда не отправляет тело, то Node в конечном итоге закроет соединение после таймаута (по умолчанию 2 минуты). Это правильное ожидаемое поведение.

EDIT Я сделал несколько вариантов, но это по существу то, что я использовал.

// The server 
 
require ("http").createServer (function (request, response) { 
 

 
\t console.log ('server request headers', request.headers); 
 

 
\t response.on ("error", function (err) { 
 
\t \t console.log ('server response on error', err); 
 
\t }); 
 

 
\t request.on ("error", function (err) { 
 
\t \t console.log ('server request on error ', err); 
 
\t }); 
 

 
\t request.on ("data", function (chunk) { 
 
\t \t console.log ('server request on data:', chunk.toString()); 
 
\t }); 
 

 
\t request.on ("end", function() { 
 
\t \t console.log ('server request on end'); 
 
\t \t response.end ('Hello World'); 
 
\t }); 
 

 
}).listen (12345); 
 

 

 
// The client 
 
var msg = 'Boo!'; 
 

 
var request = require ("http").request ({ 
 
\t hostname: '127.0.0.1', 
 
\t port: 12345, 
 
\t method: "GET", 
 
\t path: '/test' 
 
}, function (response) { 
 

 
\t console.log ('client response headers', response.headers); 
 

 
\t request.on ("error", function (err) { 
 
\t \t console.log ('client request on error', err); 
 
\t }); 
 

 
\t request.on ("finish", function() { 
 
\t \t console.log ('client request on finish'); 
 
\t }); 
 

 
\t response.on ("error", function (err) { 
 
\t \t console.log ('client response on error', err); 
 
\t }); 
 

 
\t response.on ("data", function (chunk) { 
 
\t \t console.log ('client response on data:', chunk.toString()); 
 
\t }); 
 

 
\t response.on ("finish", function() { 
 
\t \t console.log ('client response on finish'); 
 
\t }); 
 

 
}); 
 

 
request.on ("error", function (err) { 
 
\t console.log ('client request on error', err); 
 
}); 
 

 
request.write ('Boo!'); 
 
request.end();

+0

Можете ли вы показать пример кода, вызывающего «ECONNRESET»? – robertklep

+0

Конечно. См. Править выше. –

+0

Если у вас есть экземпляр сервера ('.listen (12345) .on (...)'), прослушайте события ['clientError'] (https://nodejs.org/api/http.html#http_event_clienterror) Посмотрим, почему он закрывает соединение. – robertklep

Смежные вопросы