为什么我们需要node.js中的缓冲区?

要使用节点在浏览器中显示文件的内容,我首先尝试了这一点:

var express = require('express') , fs = require('fs') , app = express() , port = process.env.PORT || 5000; app.use(express.logger()); var data = fs.readFileSync('index.html'); app.get('/', function(req, res){ res.send(data); }); app.listen(port, function(){ console.log('Listenting on ' + port); }); 

但是,这并没有如预期的那样工作。 浏览器实际上提供了index.html内容作为文件,我首先必须下载然后在文本编辑器中手动打开。 然后,我尝试使用缓冲区来做同样的事情:

 var express = require('express') , fs = require('fs') , app = express() , port = process.env.PORT || 5000; app.use(express.logger()); var data = new Buffer(fs.readFileSync('index.html')); app.get('/', function(req, res){ res.send(data.toString('utf-8')); }); app.listen(port, function(){ console.log('Listenting on ' + port); }); 

这个按预期工作, index.html内容显示在浏览器窗口内。 但是,在我的有限用户关于Node.js. 缓冲区类是处理二进制数据的全局types。 但是index.html文件不包含任何二进制数据。 所以我的问题是:

  1. 在上面的代码中,为什么index.html的内容是作为文件下载(没有缓冲区)而被直接在浏览器中显示的(带有缓冲区)?
  2. 当文件只包含string数据,为什么我需要使用缓冲区,没有二进制文件?
  3. 什么是使用缓冲区的地方?
  4. 如果我想了解有关缓冲区的更多信息,请在Node中使用。 我要去哪?

返回文件的正确方法是使用asynchronous方法而不是同步方法。

  app.get('/', function(req, res){ res.writeHead(200, { 'Content-Type': 'text/plain' // set to whatever mime type you need. }); fileSystem.createReadStream(filePath).pipe(res); }); 

如果你打算用express来提供静态文件,那么你应该使用静态中间件。

要找出示例中的差异,请查看要返回的内容types。 这就是确定浏览器对你的回应所做的事情。

在第一种情况下,Express.js会看到一个Buffer,并决定返回数据作为内容types“application / octet-stream”。 您的浏览器不知道该如何处理,并将其作为下载文件返回。

在第二种情况下,Express.js会看到一个string,并决定以内容types“text / plain”返回数据。 您的浏览器知道如何处理,并将显示给你。

我不认为你的问题与node.js中的缓冲区有很大关系,但更多的是与Express.js res.send如何处理各种inputtypes有关。

如果你是Node新手,那么你就不需要马上知道Buffers了。 否则看看文档: http : //nodejs.org/api/buffer.html#buffer_buffer