Проблемы Node Js с response.write

Когда я пытаюсь использовать HTTP-потоковое соединение, по какой-то причине запись не сбрасывается до тех пор, пока я не вызову response.end()
Я беру код прямо из демонстрации и не понимаю, в чем моя проблема.
Когда я скручиваюсь на сервер мои заголовки верны.

HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked


var http = require('http');
    http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.write('hello');
      res.write(':');
      setTimeout(function(){ 
          res.end('World\n')},
          2000);
    }).listen(1337, "127.0.0.1");
    console.log('Server running at http://127.0.0.1:1337/');

Почему сервер не отправляет данные для записи?


person Heavy Gray    schedule 20.05.2011    source источник


Ответы (5)


Я, кажется, поведение конкретного браузера - firefox сразу показывает данные («Hello:»), в то время как chrome, кажется, буферизуется и ждет, пока ответ не закончится. Обратите внимание, что хром также сразу показывает данные, если вы сначала записываете больше данных (например, я написал 1000 «Привет»).

person Geoff Chappell    schedule 20.05.2011
comment
Оказалось, что это зависит от платформы. - person Heavy Gray; 22.05.2011
comment
Вы продолжали его запускать или у вас есть какие-либо записи о том, какие платформы браузеров поставили в очередь фрагменты? - person matanster; 19.07.2013

Кажется, я понимаю, что вы имеете в виду...

Из документов node.js:

При первом вызове response.write() он отправит буферизованную информацию заголовка и первое тело клиенту. При втором вызове response.write() Node предполагает, что вы собираетесь выполнять потоковую передачу данных, и отправляет их отдельно. То есть ответ буферизуется до первого фрагмента тела.

http://nodejs.org/docs/v0.4.7/api/all.html#response.write

(Хорошее использование порта, кстати :))

person Dve    schedule 20.05.2011
comment
Я только что заметил, что мой пример кода был неправильным. Это то, что я использую, и это не потоковая передача данных. Он ждет, пока не будет вызван метод end(). - person Heavy Gray; 20.05.2011

Попробуйте проверить свой код с помощью telnet или nc. curl обычно буферизует последнюю строку

person Andrey Sidorov    schedule 20.05.2011

После исправления отсутствующей фигурной скобки ваш код работает у меня из браузера. Curl из командной строки, кажется, ожидает полного ответа, но wireshark подтверждает, что он действительно использует кодирование по частям, и в обоих случаях ответ был разделен на 2 пакета.

Я предполагаю, что вывод curl буферизуется строкой и ожидает новой строки после «Мира», прежде чем что-либо напечатать. Вы можете подтвердить это, напечатав еще одну новую строку после «hello:».

person Jörn Horstmann    schedule 20.05.2011

это связано с тем, что вы пропустили закрывающий "}" в своем коде в позиции после res.end('World\n') и перед запятой.

person Shuping    schedule 20.03.2013