evgeniy8705
@evgeniy8705
Повелитель вселенной

Почему вываливается ошибка в консоли (node.js, curl)?

В точности повторил код за лектором, но не пойму почему возникает ошибка.
Объясните пожалуйста, в чем проблема.

// node app.js
// curl -d "Hello" http://localhost:8080

let http = require(`http`).createServer().listen(8080);

http.on(`request`, (req, res) => {
  res.writeHead(200);

  res.write(`Start...\n`);

  setTimeout(() => {
    res.write(`Finish...`);

    res.end();
  }, 3000);

  req.pipe(res);
});

events.js:160                                                          
      throw er; // Unhandled 'error' event                             
      ^                                                                
                                                                       
Error: write after end                                                 
    at ServerResponse.OutgoingMessage.write (_http_outgoing.js:441:15) 
    at IncomingMessage.ondata (_stream_readable.js:555:20)             
    at emitOne (events.js:96:13)                                       
    at IncomingMessage.emit (events.js:188:7)                          
    at IncomingMessage.Readable.read (_stream_readable.js:381:10)      
    at flow (_stream_readable.js:761:34)                               
    at resume_ (_stream_readable.js:743:3)                             
    at _combinedTickCallback (internal/process/next_tick.js:80:11)     
    at process._tickCallback (internal/process/next_tick.js:104:9)
  • Вопрос задан
  • 875 просмотров
Решения вопроса 1
Похоже ошибка в том, что pipe по умолчанию закрывает стрим. В таком случае, исправлением будет добавить {end:false} как опцию

https://nodejs.org/api/stream.html#stream_readable...

readable.pipe(destination[, options])#

Added in: v0.9.4
destination The destination for writing data
options Pipe options
end End the writer when the reader ends. Defaults to true.



Гугл кстати подсказывает
stackoverflow.com/questions/39804007/how-to-write-...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@immaculate
Программист-путешественник
Плохо знаком с Node.js, но полагаю, что это потому что при завершении вашей функции ответ res закрывается. Когда заканчивается таймаут и запускается обработчик, сокет уже закрыт.
Ответ написан
Комментировать
severus256
@severus256
Code everywhere....
Мне кажется проблема в том, что один из res.write() вызывается после res.end()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы