1. Analisis pembukaan
Modul Sistem File adalah set kemasan sederhana dari metode operasi I/O File POSIX standar. Modul dapat diperoleh dengan menelepon membutuhkan ("FS"). Semua metode dalam modul sistem file tersedia dalam versi asinkron dan sinkron.
(1) Metode asinkron dalam modul sistem file memerlukan fungsi panggilan balik yang lengkap sebagai parameter formal yang masuk terakhir.
(2) Komposisi fungsi callback ditentukan dengan metode asinkron yang disebut. Secara umum, parameter formal pertama dari fungsi callback adalah pesan kesalahan yang dikembalikan.
(3) Jika operasi asinkron dieksekusi dengan benar dan kembali, parameter formal kesalahan adalah nol atau tidak terdefinisi. Jika Anda menggunakan versi sinkron dari metode operasi, setelah kesalahan terjadi, kesalahan akan dikembalikan dalam bentuk biasa melempar kesalahan.
(4) Anda dapat menggunakan pernyataan mencoba dan menangkap untuk mencegat kesalahan dan membuat program berlanjut.
Mari pertama -tama lihat contoh sederhana, baca file ("bb.txt"):
(1) Buat file "bb.txt", sebagai berikut ("Halo semuanya, saya nobita! (*^__^*) hehe ...").
(2), baca operasi file sebagai berikut:
Salinan kode adalah sebagai berikut:
var fs = membutuhkan ("fs");
fs.readfile ("bb.txt", "utf8", function (error, data) {
if (error) lempar kesalahan;
console.log (data);
});
Hasil Menjalankan:
Yang perlu Anda perhatikan di sini adalah: Anda harus mengatur pengkodean saat membaca file, jika tidak formulir default akan muncul di "buffer".
Melihat efek berjalan yang tidak ditetapkan, perbedaannya masih sangat jelas. sebagai berikut:
Operasi tulis lainnya, sebagai berikut:
Salinan kode adalah sebagai berikut:
var fs = membutuhkan ("fs");
var txt = "Semua orang harus belajar nodeJS !!!" ;
// Tulis ke file
fs.writeFile ("bb.txt", txt, function (err) {
if (err) lempar err;
console.log ("File disimpan!"); // file disimpan
});
Hasil Menjalankan:
Berikut adalah beberapa contoh umum:
Salinan kode adalah sebagai berikut:
// hapus file
fs.unlink ('bb.txt', function () {
Console.log ('Success');
});
// Ubah nama file
fs.rename ('bb.txt', 'bigbear.txt', function (err) {
console.log ('ganti nama kesuksesan');
});
// periksa status file
fs.stat ('bb.txt', function (err, stat) {
console.log (stat);
});
// Tentukan apakah ada file
fs.exists ('bb.txt', fungsi (ada) {
console.log (ada);
});
2. Koneksi antara FS dan Stream
"Stream" memiliki fitur asinkron. Dapatkah saya membagi file atau sepotong konten menjadi "potongan" yang tidak diketahui dan membacanya, dan setiap kali "potongan" dibaca, kami mengeluarkannya. Sampai file selesai. Ini seperti "penyandian transfer: chunked" yang didukung oleh "http1.1". ("Chunk" dapat ada dalam bentuk apa pun, nodeJs ada dalam bentuk "buffer" secara default, yang lebih efisien). "Stream" di Nodejs memiliki fitur super pada sistem UNIX, yaitu ("Pipe" ------ Pipeline).
Apakah Anda masih ingat program NodeJS pertama "Halo, Big Bear!"? Kami membuat beberapa modifikasi berdasarkan applet, sebagai berikut:
(1), buat "bb.html"
Salinan kode adalah sebagai berikut:
<Html>
<head>
<type style = "text/css">
Div {
margin-top: 50px;
Lebar: 100%;
margin: 0px;
Tinggi: 120px;
Line-Height: 120px;
Warna: #FFFF;
Ukuran font: 22px;
Latar Belakang:#FF9900;
Teks-Align: tengah;
}
</tyle>
</head>
<body>
<div> halo, beruang besar! </div>
</body>
</html>
(2), ubah program sebelumnya sebagai berikut:
Salinan kode adalah sebagai berikut:
var http = membutuhkan ('http');
var fs = membutuhkan ("fs");
var server = http.createServer (function (req, res) {
fs.readfile ("bb.html", "utf-8", fungsi (err, data) {
if (err) {
res.writeHead (500, {'konteks-tipe': 'text/polos'});
res.end ('tentukan file tidak ada! atau kesalahan server!');
}
kalau tidak{
res.writeHead (200, {'konteks-tipe': 'text/html'});
res.write (data);
res.end ();
}
})
});
server.listen (8888);
Console.log ("Server HTTP berjalan di port 8888 ...");
Berikut ini adalah hasil berjalan:
Sekarang kita perlu memikirkannya, jika kita mengirim bukan file teks sederhana tetapi file hypermedia, seperti file video HD lengkap dari konferensi IO Google 2014. Format MP4. Panjang lebih dari 2 jam 1080p.
Sekitar 4 GB. Cara "ReadFile" diketahui berfungsi adalah membaca file ke dalam memori. Maka file besar seperti itu jelas tidak dapat dilakukan. Jadi apa yang harus saya lakukan? Setelah itu, Anda perlu menggunakan aliran untuk melakukannya. Jadi itu saja.
Kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
fs.createreadstream (__ dirname + '/vedio.mp4').pipe(res);
Untuk meringkas:
Kode -kode ini dapat mengimplementasikan fungsi yang diperlukan, tetapi layanan perlu men -cache seluruh data file ke memori sebelum mengirim data file, jika file "bb.html" sangat
Jika besar dan memiliki konkurensi yang besar, banyak memori akan terbuang sia -sia. Karena pengguna perlu menunggu sampai seluruh file di -cache ke memori untuk menerima data file, ini mengarah ke
Pengalaman pengguna cukup buruk. Untungnya, kedua parameter "(req, res)" adalah aliran, sehingga kita dapat menggunakan fs.createreadstream () bukan "fs.readfile ()".
Tiga, contoh
Datang untuk mengunggah file:
(1) Buat "server.js"
Salinan kode adalah sebagai berikut:
var http = membutuhkan ('http');
var url = membutuhkan ('url');
fungsi start (rute, pawang) {
function onRequest (request, response) {
var pathname = url.parse (request.url) .pathname;
// Rute ke logika bisnis yang sesuai
rute (pathname, pawang, respons, permintaan);
}
http.createServer (OnRequest) .listen (3000);
console.log ('server mulai');
}
Exports.start = Mulai;
(2) Buat "route.js"
Salinan kode adalah sebagai berikut:
rute fungsi (pathname, pawang, respons, permintaan) {
console.log ('akan merutekan permintaan' + pathname);
if (typeof handler [pathname] === 'function') {
return handler [pathname] (respons, permintaan);
} kalau tidak {
console.log ('tidak ada penangan permintaan yang ditemukan untuk' + pathname);
response.writeHead (404, {'tipe konten': 'Text/html'});
response.write ('404 tidak ditemukan!');
response.end ();
}
}
Exports.Route = rute;
(3) Buat "requesthandler.js"
Salinan kode adalah sebagai berikut:
var queryString = membutuhkan ('querystring'),
fs = membutuhkan ('fs'),
tangguh = membutuhkan ('tangguh');
fungsi start (respons, permintaan) {
Console.log ('Mulai Modul');
var body = '<html>'+
'<head>'+
'<meta http-equiv = "tipe konten"'+
'Content = "text /html; charset = utf-8" />'+
'</head>'+
'<body>'+
'<Form action = "/unggah" enctype = "multipart/form-data" metode = "post">'+
'<input type = "file" name = "unggah" multiple = "ganda">'+
'<input type = "kirim" value = "kirim teks" />'+
'</form>'+
'</body>'+
'</html>';
response.writeHead (200, {'content-type': 'Text/html'});
response.write (tubuh);
response.end ();
}
unggah fungsi (respons, permintaan) {
console.log ('unggah modul');
var Form = new paceidable.incomingform ();
form.parse (permintaan, fungsi (kesalahan, bidang, file) {
fs.renamesync (file.upload.path, '/tmp/test.png');
response.writeHead (200, {'content-type': 'Text/html'});
response.write ('Anda /' kirim: <br /> ');
response.write ('<img src = " /show" />');
response.end ();
});
}
function show (response, request) {
Console.log ('Modul Show');
fs.readfile ('/tmp/test.png', 'biner', function (error, file) {
if (error) {
response.writeHead (200, {'content-type': 'Text/html'});
response.write (kesalahan);
response.end ();
} kalau tidak {
response.writeHead (200, {'tipe konten': 'gambar/png'});
response.write (file, 'biner');
response.end ();
}
});
}
Exports.start = Mulai;
Exports.upload = unggah;
Exports.show = show;
(4) Buat "index.js"
Salinan kode adalah sebagai berikut:
var server = membutuhkan ('./ server');
var router = membutuhkan ('./ router');
var requestHandler = membutuhkan ('./ RequestHandler');
var tangguh = membutuhkan ('tangguh'); // membutuhkan algoritma pencarian jalur? ?
var handler = {};
Handler ['/'] = RequestHandler.start;
Handler ['/start'] = requestHandler.start;
handler ['/unggah'] = requestHandler.upload;
Handler ['/show'] = requestHandler.show;
server.start (router.Route, pawang);
Empat, mari kita ringkas
(1) Memahami "koneksi antara FS dan aliran".
(2) Mahir dalam menggunakan API terkait "FS".
(3) Perhatikan detailnya, seperti: rincian pemrosesan antara metode sinkronisasi API Operasi File dan metode asinkron.
(4), dan akhirnya menekankan: memahami metode organisasi kode dalam contoh unggahan file, terus -menerus refactor, dan terus -menerus meringkas.