1。オープニング分析
ファイルシステムモジュールは、標準のPOSIXファイルI/O操作方法の単純なパッケージセットです。モジュールは、呼び出し要求( "fs")で取得できます。ファイルシステムモジュール内のすべてのメソッドは、非同期バージョンと同期バージョンで使用できます。
(1)ファイルシステムモジュールの非同期メソッドには、最後の着信形式パラメーターとして完了したコールバック関数が必要です。
(2)コールバック関数の構成は、呼ばれる非同期法によって決定されます。一般に、コールバック関数の最初の正式なパラメーターは、返されたエラーメッセージです。
(3)非同期操作が正しく実行されて返される場合、エラーの正式なパラメーターはnullまたは未定義です。操作方法の同期バージョンを使用している場合、エラーが発生すると、エラーが通常の形でエラーが返されます。
(4)Try -and Catchステートメントを使用して、エラーを傍受し、プログラムを継続させることができます。
まず、簡単な例を見てみましょう。ファイルを読んでください( "bb.txt"):
(1)次のように「bb.txt」を作成します(「みなさん、こんにちは、私はnobitaです!(*^__^*)hehe ...」)。
(2)、次のようにファイル操作を読み取ります。
コードコピーは次のとおりです。
var fs = require( "fs");
fs.readfile( "bb.txt"、 "utf8"、function(error、data){
if(エラー)スローエラー。
console.log(data);
});
実行結果:
ここで注意する必要があるのは、ファイルを読み取るときにエンコードを設定する必要があります。そうしないと、デフォルトのフォームが「バッファ」に表示されます。
設定されていないランニング効果を見ると、違いはまだ非常に明白です。次のように:
次のように別の書き込み操作:
コードコピーは次のとおりです。
var fs = require( "fs");
var txt = "誰もがnodejsを学ぶべきです!!!" ;
//ファイルに書き込みます
fs.writefile( "bb.txt"、txt、function(err){
(err)スローERR;
console.log( "file saved!"); //ファイルが保存されます
});
実行結果:
いくつかの一般的な例があります:
コードコピーは次のとおりです。
//ファイルを削除します
fs.unlink( 'bb.txt'、function(){
console.log( 'success');
});
//ファイル名を変更します
fs.rename( 'bb.txt'、 'bigbear.txt'、function(err){
console.log( 'rename success');
});
//ファイルのステータスを確認します
fs.stat( 'bb.txt'、function(err、stat){
console.log(stat);
});
//ファイルが存在するかどうかを判断します
fs.exists( 'bb.txt'、function(exists){
console.log(存在する);
});
2。FSとストリーム間の接続
「ストリーム」には非同期機能があります。ファイルまたはコンテンツを不明な「チャンク」に分割して読むことはできますか?「チャンク」が読まれるたびに出力できます。ファイルが完了するまで。これは、「HTTP1.1」でサポートされている「転送エンコード:チャンク」のようなものです。 (「チャンク」は任意の形式で存在する可能性があり、nodejsはデフォルトで「バッファ」の形で存在しますが、これはより効率的です)。 Nodejsの「ストリーム」には、UNIXシステムのスーパー機能があります。
最初のnodejsプログラム「こんにちは、ビッグベア!」をまだ覚えていますか?次のように、アプレットに基づいていくつかの変更を加えます。
(1)、「bb.html」を作成します
コードコピーは次のとおりです。
<html>
<head>
<style type = "text/css">
div {
マージントップ:50px;
幅:100%;
マージン:0px;
高さ:120px;
ラインハイト:120px;
色:#ffff;
フォントサイズ:22px;
背景:#ff9900;
テキストアライグ:センター;
}
</style>
</head>
<body>
<div>こんにちは、ビッグベア! </div>
</body>
</html>
(2)、以前のプログラムを次のように変更します。
コードコピーは次のとおりです。
var http = require( 'http');
var fs = require( "fs");
var server = http.createserver(function(req、res){
fs.readfile( "bb.html"、 "utf-8"、function(err、data){
if(err){
res.writehead(500、{'context-type': 'text/plain'});
res.End( 'ファイルが存在しないことを指定!またはサーバーエラー!');
}
それ以外{
res.writehead(200、{'Context-Type': 'text/html'});
res.write(data);
res.end();
}
})
});
server.listen(8888);
console.log( "ポート8888で実行されているhttpサーバー...");
以下は実行中の結果です。
単純なテキストファイルではなく、Google 2014 IO Conferenceの完全なHDビデオファイルなどのHyperMediaファイルを送信している場合、それについて考える必要があります。 MP4形式。長さは2時間以上1080pです。
約4 GB。 「readfile」が機能することが知られている方法は、ファイルをメモリに読み込むことです。その後、そのような大きなファイルは明らかに実行できません。それで、私は何をすべきですか?その後、ストリームを使用してそれを行う必要があります。それだけです。
コードは次のとおりです。
コードコピーは次のとおりです。
fs.createreadstream(__ dirname + '/vedio.mp4').pipe(res);
要約するには:
これらのコードは必要な関数を実装できますが、「bb.html」ファイルが非常にある場合、ファイルデータを送信する前にファイルデータ全体をメモリにキャッシュする必要があります
それが大きく、大きな並行性がある場合、多くの記憶が無駄になります。ユーザーは、ファイル全体がメモリにキャッシュされるまで待機する必要があるため、ファイルデータを受け入れる必要があるため、これは
ユーザーエクスペリエンスは非常に悪いです。幸いなことに、両方のパラメーター「(req、res)」はストリームであるため、「fs.readfile()」の代わりにfs.createreadstream()を使用できます。
3つ、例
ファイルをアップロードしてください:
(1)「server.js」を作成する
コードコピーは次のとおりです。
var http = require( 'http');
var url = require( 'url');
function start(route、handler){
function onrequest(request、response){
var pathname = url.parse(request.url).pathname;
//対応するビジネスロジックへのルーティング
ルート(PathName、Handler、Response、Request);
}
http.createserver(onrequest).listen(3000);
console.log( 'サーバーが起動している');
}
exports.start = start;
(2)「route.js」を作成する
コードコピーは次のとおりです。
関数ルート(PathName、Handler、Response、Request){
console.log( '' + pathnameのリクエストをルーティングしようとしています);
if(typeof handler [pathname] === 'function'){
Return Handler [pathname](Response、request);
} それ以外 {
console.log( '' + pathnameのリクエストハンドラーは見つかりません);
Response.writehead(404、{'content-type': 'text/html'});
Response.write( '404 not not found!');
Response.End();
}
}
exports.route = route;
(3)「requesthandler.js」を作成する
コードコピーは次のとおりです。
var querystring = require( 'querystring')、
fs = require( 'fs')、
defidable = require( 'Fromidable');
関数開始(応答、要求){
console.log( 'start module');
var body = '<html>'+
'<head>'+
'<メタhttp-equiv = "content-type"'+
'content = "text /html; charset = utf-8" />'+
'</head>'+
'<body>'+
'<form action = "/upload" enctype = "multipart/form-data" method = "post">'+
'<入力型= "ファイル" name = "upload"倍数= "倍数">'+
'<入力型= "submit" value = "text" />'+
'</form>'+
'</body>'+
'</html>';
respons.writehead(200、{'content-type': 'text/html'});
Response.write(body);
Response.End();
}
関数アップロード(応答、リクエスト){
console.log( 'アップロードモジュール');
var form = new fordidable.incomingform();
form.parse(request、function(error、fields、files){
fs.renamesync(files.upload.path、 '/tmp/test.png');
respons.writehead(200、{'content-type': 'text/html'});
respons.write( 'you /' ve sent:<br /> ');
respons.write( '<img src = " /show" />');
Response.End();
});
}
関数show(応答、要求){
console.log( 'show module');
fs.readfile( '/tmp/test.png'、 'binary'、function(error、file){
if(error){
respons.writehead(200、{'content-type': 'text/html'});
Response.write(エラー);
Response.End();
} それ以外 {
Response.writehead(200、{'content-type': 'image/png'});
Response.write(file、 'binary');
Response.End();
}
});
}
exports.start = start;
exports.upload = upload;
exports.show = show;
(4)、「index.js」を作成します
コードコピーは次のとおりです。
var server = require( './ server');
var router = require( './ router');
var requesthandler = require( './ requesthandler');
var defidable = require( 'Fromidable'); //パス検索アルゴリズムが必要ですか? ?
var handler = {};
ハンドラー['/'] = requesthandler.start;
ハンドラー['/start'] = requesthandler.start;
ハンドラー['/upload'] = requesthandler.upload;
ハンドラー['/show'] = requesthandler.show;
server.start(router.route、handler);
4つ、要約しましょう
(1)「FSとストリーム間の接続」を理解する。
(2)「FS」関連APIの使用に習熟しています。
(3):ファイル操作API同期方法と非同期方法の間の処理の詳細など、詳細に注意してください。
(4)、そして最後に強調します。ファイルアップロードの例でコード組織メソッドを理解し、絶えずリファクタリングし、常に要約します。