要使用节点在浏览器中显示文件的内容,我首先尝试了这个:
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
文件不包含任何二进制数据。所以我的问题是:
index.html
的内容作为文件下载(没有缓冲区)提供而不是直接在浏览器中显示(带缓冲区)?答案 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}}