使用Node.js的createReadStream()函数时,为什么浏览器会继续加载

时间:2018-10-04 15:14:00

标签: javascript node.js server

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服务器正常吗?图标是否一直旋转,但对服务器没有任何影响?还是我错过了某些东西并且图标不应该一直旋转?

1 个答案:

答案 0 :(得分:2)

您似乎没有结束回复。浏览器可能认为请求未完成,因此继续“加载”。

如果您在开发人员控制台中查看“网络”标签,则可能会看到请求尚未完成。

您应该发送response.end()

  

此方法向服务器发出信号,指示所有响应头和主体已发送;该服务器应认为此消息已完成。必须在每个响应上调用方法response.end()。

我相信您在写头后应该同时在response.end()readerStream.on('end'回调中调用readerStream.on('error'。这将告诉浏览器请求已完成,并且可以停止加载操作。