После ряда экспериментов, по-видимому определяющих 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();
Что это приложение? Используете ли вы экспресс или какую-либо другую структуру или чисто узел? – tpie
Просто чистый узел. Я пытаюсь понять, как поток действительно работает и не может ничего понять в документах. –
Узел довольно низкий на своем собственном уровне. Что выражается в 10 строках, вам придется писать всевозможные вещи ... – tpie