Jumat, 27 Januari 2017

Belajar Node.js Dan Socket.io Part 2 : Mengirim Data Dari File

Di tutorial sebelumnya, kita sudah berhasil mengirimkan Hello world ke client. Namun, kerja server tidak akan pernah semudah itu. Jadi, untuk tutorial yang kedua ini, kita akan mencoba mengirim data dari file yang berada pada server.

Untuk menangani permintaan file, node.js menyediakan modul filesystem (fs). Ada banyak fungsi yang mudah digunakan untuk menangani file, terutama jika terbiasa berkutat dengan pemrograman C. Memahaminya tidak akan sulit, karena basis manajemen file yang diterapkan hampir sama dengan yang diterapkan libc. Jika belum terbiasa, jangan kawatir, ada pula varian fungsi yang lebih mudah untuk digunakan dari modul tersebut.

https://nodejs.org/api/fs.html

Beberapa fungsi yang ada bekerja secara synchronous, dan beberapa lainnya bekerja secara asynchronous. Fungsi synchronous akan bekerja hingga proses selesai. Jika terjadi error, node.js akan menghasilkan exception dan proses server segera terhenti. Sedangkan fungsi asynchronous akan bekerja dalam background. Semua varian fungsi ini umumnya harus dipanggil dengan menyertakan fungsi callback. Ketika proses yang dikerjakan dalam background selesai, callback akan dipanggil dengan memberikan hasil dan statusnya. Ketika terjadi error, node.js tidak akan menghasilkan exception. Adalah tugas programmer untuk memilih tindakan, tepat setelah error terjadi.

Fungsi asynchronous akan berguna ketika mengimplementasikan server yang sudah benar-benar siap pakai. Ini untuk menghindari proses server terhenti ketika error. Meski demikian, fungsi asynchronous lebih mudah untuk dipelajari, cocok untuk yang masih tahap belajar. Jadi, untuk tutorial kali ini, kita lebih banyak menggunakan varian fungsi synchronous.



Apa sih yang sebenarnya akan dibahas disini? Sebenarnya eksperimen yang akan kita lakukan kali ini cukup simpel, yaitu mengirimkan data dari file, bukan lagi hello world.

test.js
var http = require('http');
var fs = require('fs');

var app = http.createServer(function(request, response) {
var data;

data = fs.readFileSync("test.html");
response.writeHead(200, {"Content-Type": 'text/html'});
response.write(data);
response.end()
console.log("Request OK");
});

app.listen(3000);

Method readFileSync() memerlukan sebuah parameter wajib berupa nama file. Hasil return value yang diperoleh berupa data file hasil pembacaan. Jika error, misalnya karena file tidak ada, node.js akan menghasilkan exception.

test.html
<!doctype html>
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Lorep Ipsum</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</body>
</html>

Hasilnya akan seperti ini:


Tapi rasanya masih belum lengkap ya? OK, kita kembangkan dengan beberapa baris kode.
var url = require('url');
var http = require('http');
var fs = require('fs');
var path = require("path");

var app = http.createServer(function(request, response) {
var uri;

uri = url.parse(request.url).pathname;
if (uri == '/') uri += 'index.html';
uri = path.join(__dirname,uri);

data = fs.readFile(uri, function(err,data){
if(err){
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
return;
} else {
response.writeHead(200, {"Content-Type": 'text/html'});
response.write(data);
response.end()
console.log("Request OK");
}
});
});

app.listen(3000);

Dengan modul url, kita bisa menemukan konten manakah yang sedang direquest oleh client. Misalnya, ketika diakses http://localhost/mypage.html, modul ini bisa digunakan untuk memisahkan domain dengan alamat file relatif yang akan diakses; yaitu /mypage.html.

uri = url.parse(request.url).pathname;

Ketika mengakses folder root server ( / ), apa yang harus kita kirim? kita akan meniru web server pada umumnya, yaitu mengirim konten dari file index.html.

if (uri == '/') uri += 'index.html';

Karena alamat uri bersifat relatif dan terdapat awalan slash, kita tidak bisa serta merta menggunakannya sebagai argumen untuk membaca file. Jadi kita menggabungkannya dengan __dirname. Nilai ini berupa konstan yang menunjukkan current directory dari file yang sedang dieksekusi node.js.

uri = path.join(__dirname,uri);

Untuk menghindari exception, disini kita akan menggunakan varian readFile asynchronous. Prototypenya adalah sebagai berikut.
fs.readFile(file[, options], callback)

Sedangkan prototype fungsi callbacknya:
callback(error, data)

Apabila readFile mengalami error, dapat dipastikan argumen error bernilai selain 0. Penyebab error bisa bermacam macam, tapi pada umumnya adalah karena file tidak ditemukan. Untuk itu, jika error kita akan mengirimkan 404 ke client sebagai indikasi bahwa file yang diminta tidak ditemukan di server.

if(err){ //err != 0
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
return;
}

Penasaran, hasilnya seperti apa ya?

file index.html ditampillkan pada home page

mengakses file 'a' yang tidak ada


WOW, keren...
Masih semangat bukan? Itu masih bukan apa-apa. Nanti di part selanjutnya, kita akan mencoba eksperimen yang lebih keren lagi.

See ya...
Load disqus comments

0 comments