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

时间:2013-07-14 09:47:26

标签: string node.js binary buffer

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

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。 Buffer类是处理二进制数据的全局类型。但是index.html文件不包含任何二进制数据。所以我的问题是:

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

1 个答案:

答案 0 :(得分:2)

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

 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提供静态文件,那么您应该使用静态中间件。

要了解示例中的差异,请查看返回的内容类型。这就决定了浏览器对您的回复做了什么。

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

在第二种情况下,Express.js会看到一个String并决定将数据作为内容类型“text / plain”返回。您的浏览器知道如何处理并向您展示。

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

如果您是Node新手,那么我认为您不需要立即了解缓冲区。否则,请查看文档:{​​{3}}