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服务器正常吗?图标是否一直旋转,但对服务器没有任何影响?还是我错过了某些东西并且图标不应该一直旋转?
答案 0 :(得分:2)
您似乎没有结束回复。浏览器可能认为请求未完成,因此继续“加载”。
如果您在开发人员控制台中查看“网络”标签,则可能会看到请求尚未完成。
您应该发送response.end()
此方法向服务器发出信号,指示所有响应头和主体已发送;该服务器应认为此消息已完成。必须在每个响应上调用方法response.end()。
我相信您在写头后应该同时在response.end()
和readerStream.on('end'
回调中调用readerStream.on('error'
。这将告诉浏览器请求已完成,并且可以停止加载操作。