Почему браузер продолжает загружаться при использовании createReadStream() Node.js

Новичок в Node.js. Я понимаю, что функция createReadStream() лучше для производительности, чем readFile(), потому что createReadStream() читает и записывает данные в патронах, а readFile() сначала читает все содержимое. Таким образом, если файл большой, функция readFile() может занять больше времени, прежде чем данные смогут быть обработаны дальше. Таким образом, я решил создать сервер, используя функцию createReadStream(), как показано ниже.

    // Create a server with fs.createReadStream(), better performance and less memory usage.
    http.createServer( function (request, response) {
      // Parse the request containing file name
      var pathname = url.parse(request.url).pathname;

      // Create a readable stream.
      var readerStream = fs.createReadStream(pathname.substr(1));

      // Set the encoding to be UTF8.
      readerStream.setEncoding('UTF8');

      // Handle stream events --> data, end and error
      readerStream.on('data', function(chunk) {
        // Page found
        // HTTP Status: 200 : OK
        // Content Type: text/plain
        response.writeHead(200, {'Content-type': 'text/html'});

        // Write the content of the file to response body.
        response.write(chunk);

        console.log('Page is being streamed...');
      });

      readerStream.on('end', function() {
        console.log('Page is streamed and emitted successfully.');
      });

      readerStream.on('error', function(err) {
        // HTTP Status: 404 : NOT FOUND
        // Content Type: text/plain
        response.writeHead(404, {'Content-type': 'text/html'});

        console.log('Page streaming error: ' + err);
      });

      console.log('Code ends!');

    }).listen(8081);

    // Console will print the message
    console.log('Server running at http://127.0.0.1:8081/');

Мой файл .html или .txt содержит три короткие строки текста. После запуска моего сервера я захожу на свою веб-страницу, перейдя по адресу http://127.0.0.1:8081/index.html. Все работает нормально, и содержимое index.html отображается в браузере.

Но на вкладке браузера иконка загрузчика все время крутится как будто держит загрузку около 1 минуты.

Это нормально для сервера Node.js? Значок просто продолжает вращаться, но ничего не стоит серверу? Или я что-то пропустил, и значок не должен постоянно вращаться?


person O Connor    schedule 04.10.2018    source источник


Ответы (1)


Не похоже, что вы заканчиваете свой ответ. Браузер, вероятно, считает, что запрос не завершен, и поэтому продолжает «загружаться».

Если вы посмотрите на вкладку «Сеть» в консоли разработчика, вы можете увидеть, что запрос не завершен.

Вы должны отправить response.end()

Этот метод сообщает серверу, что все заголовки и тело ответа отправлены; этот сервер должен считать это сообщение полным. Метод response.end() ДОЛЖЕН вызываться для каждого ответа.

Я считаю, что вы должны вызывать response.end() как в обратных вызовах readerStream.on('end', так и в readerStream.on('error' после того, как вы напишете заголовок. Это сообщит браузеру, что запрос завершен, и он может остановить загрузку.

person Andrew Lohr    schedule 04.10.2018
comment
Спасибо! это решение! Я вызываю response.end() в трех обратных вызовах readerStream.on('data'), readerStream.on('end') и readerStream.on('error'). - person O Connor; 05.10.2018