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ブラウザは、最初にダウンロードしてテキストエディタで手動で開く必要があるファイルとして実際にコンテンツを提供しました。次に、 buffer を使用して同じことを試みました。

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 に関する私の限られたユーザーの立場では。バッファクラスは、バイナリデータを扱うグローバルタイプです。ただし、index.htmlファイルにはバイナリ データが含まれていませんでした。私の質問は次のとおりです。

  1. 上記のコードで、コンテンツがindex.htmlファイルのダウンロード (バッファなし) として提供されたのに対し、ブラウザに直接表示される (バッファあり) のはなぜですか?
  2. ファイルに文字列データのみが含まれ、バイナリが含まれていない場合、なぜバッファを使用する必要があるのですか?
  3. バッファが使用されるオファーの場所は何ですか?
  4. バッファについて詳しく知りたい場合は、Node.js で使用します。どこに行けばいいですか?
4

1 に答える 1

3

ファイルを返す正しい方法は、sync メソッドの代わりに async メソッドを使用することです。

 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 で静的ファイルを提供する場合は、静的ミドルウェアを使用する必要があります。

あなたの例の違いを見つけるには、返される content-type を見てください。それが、ブラウザが応答に対して何をするかを決定するものです。

最初のケースでは、Express.js は Buffer を見て、データを content-type "application/octet-stream" として返すことにしました。お使いのブラウザはこれをどう処理すればよいか分からず、ダウンロード ファイルとして返します。

2 番目のケースでは、Express.js は文字列を認識し、データを content-type "text/plain" として返すことにしました。ブラウザはそれを処理する方法を知っており、それを表示します。

あなたの質問は node.js のバッファとはあまり関係がないと思いますが、Express.js res.send がさまざまな入力タイプを処理する方法にもっと関係があると思います。

Node を初めて使用する場合は、すぐに Buffers について知る必要はないと思います。それ以外の場合は、ドキュメントをご覧ください: http://nodejs.org/api/buffer.html#buffer_buffer

于 2013-07-14T10:04:39.967 に答える