Aplikasi web memerlukan file - file statis seperti CSS, font dan gambar atau file - file library JavaScript agar aplikasi web bekerja sebagaimana mestinya. File - file ini sengaja dipisahkan agar terstruktur dan secara best practices file - file ini memang harus dipisahkan. Lalu bagaimana caranya Node.js bisa menyediakan file - file ini ?...ok mari kita buat server Node.js yang fungsinya untuk menyediakan file statis.
Agar server Node.js bisa mengirimkan file statis ke klien maka server perlu mengetahui path
atau tempat dimana file tersebut berada.
Node.js bisa mengirimkan file tersebut secara streaming melalui fungsi fs.createReadStream()
. Sebelum dijelaskan lebih lanjut mungkin bisa dilihat atau di coba saja server file Node.js dibawah ini
var http = require('http'),
parse = require('url').parse,
join = require('path').join,
fs = require('fs'),
root = join(__dirname, 'www'),
PORT = 3300,
server = http.createServer(function(req, res){
var url = parse(req.url),
path = join(root, url.pathname),
stream = fs.createReadStream(path);
stream.on('data', function(bagian){
res.write(bagian);
});
stream.on('end', function(){
res.end();
});
stream.on('error', function(){
res.setHeader('Content-Type','text/html');
var url_demo = "http://localhost:"+PORT+"/index.html";
res.write("coba buka <a href="+url_demo+">"+url_demo+"</a>");
res.end();
})
});
server.listen(PORT);
console.log('Port '+PORT+': Server File ');
Berikut sedikit penjelasan dari kode diatas
__dirname
merupakan variabel global yang disediakan oleh Node.js yang berisi path direktori dari file yang sedang aktif mengeksekusi__dirname
.root
merupakan direktori root atau referensi tempat dimana file-file yang akan dikirimkan oleh server Node.js. Pada kode server diatas direktori root di setting pada direktoriwww
.path
adalah path file yang bisa didapatkan dengan menggabungkan path direktori root danpathname
.pathname
yang dimaksud di sini misalnya jika URL yang diminta yaituhttp://localhost:3300/index.html
makapathname
adalah/index.html
. Nilai variabelpath
dihasilkan dengan memakai fungsijoin()
.
var path = join(root, url.pathname)
stream
yang di kembalikan oleh fungsifs.createReadStream()
merupakan classstream.Readable
. Objekstream
ini mengeluarkan data secara streaming untuk di olah lebih lanjut. Perlu menjadi catatan bahwastream.Readable
tidak akan mengeluarkan data jikalau tidak di kehendaki. Nah...cara untuk mendeteksi data streaming ini sudah siap di konsumsi atau belum adalah melalui event.
Event yang di dukung oleh class stream.Readable
adalah sebagai berikut
- Event:
readable
- Event:
data
- Event:
end
- Event:
error
- Event:
close
Mungkin anda bertanya kenapa server file statis diatas memakai stream, bukankah menyediakan file secara langsung saja sudah bisa? jawabannya memang bisa, tetapi mungkin tidak akan efisien kalau file yang akan di berikan ke client mempunyai ukuran yang besar. Coba lihat kode berikut
var http = require('http');
var fs = require('fs');
var server = http.createServer(function (req, res) {
fs.readFile(__dirname + '/data.txt', function (err, data) {
res.end(data);
});
});
server.listen(8000);
Jika file data.txt
terlalu besar maka buffer yang digunakan oleh sistem juga besar dan konsumsi memori juga akan bertambah besar seiring semakin banyak pengguna yang mengakses file ini.
Jika anda ingin lebih banyak mendalami tentang Node.js Stream silahkan lihat resource berikut (dalam Bahasa Inggris):