4

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

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. 使用缓冲区的offer地点有哪些?
  4. 如果我想了解更多关于缓冲区的信息并在 Node.js 中使用。我要去哪?
4

1 回答 1

3

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

 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 会看到一个缓冲区并决定将数据作为内容类型“application/octet-stream”返回。您的浏览器将不知道如何处理它并将其作为下载文件返回。

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

我认为您的问题与 node.js 中的缓冲区没有太大关系,而与 Express.js res.send 如何处理各种输入类型有关。

如果您是 Node 新手,那么我认为您不需要立即了解 Buffers。否则,请查看文档:http ://nodejs.org/api/buffer.html#buffer_buffer

于 2013-07-14T10:04:39.967 回答