Asas Node.js – Built-in module

<Tutorial >

Dalam Node.js terdapat tidaklah terlalu banyak built-in module. Tapi aku tak akan bincangkan kesemua module tersebut. Aku hanya akan bincangkan beberapa built-in module yang agak penting & digunakan agak kerap ketika pembangunan aplikasi node.js. Antaranya adalah:

  • Path module
  • OS module
  • File System Module
  • Events Module
  • HTTP Module

Path module

Digunakan untuk handle file path. Contohnya

app.js

const path = require('path');

var pathObj = path.parse(__filename);

console.log(pathObj);

path.parse() akan return objek yang mana property-nya adalah unsur penting path tersebut. Seperti yang kita tahu, __filename disini adalah C:\Users\ceghap\codes\learn-nodejs\app.js

Di windows:

{
  root: 'C:\\',
  dir: 'C:\\Users\\ceghap\\codes\\learn-nodejs',
  base: 'app.js',
  ext: '.js',
  name: 'app'
}

Di linux/unix-like

{
  root: '/',
  dir: '/home/ceghap/codes/learn-nodejs',
  base: 'app.js',
  ext: '.js',
  name: 'app'
}

OS module

Module ini memberikan informasi mengenai Sistem Operasi yang menjalankan nodejs

app.js

const cpuArch = os.arch();
const tmpDir = os.tmpdir();
const platform = os.platform();
const release = os.release();
const uptime = os.uptime();
const type = os.type();
const version = os.version();
const user = os.userInfo();

console.log(`total memory : ${totalmem}`);
console.log(`free memory: ${freemem}`);
console.log(`total cpus is ${cpus.length}`);
console.log(`home directory is ${homeDir}`);
console.log(`host name is ${hostName}`);
console.log(`the CPU architecture is ${cpuArch}`);
console.log(`the default temporary files directory is ${tmpDir}`);
console.log(
  `the os platform is ${platform} & the release is ${release}. this os is ${type} type and was a ${version}.`
);
console.log(`this machines has been operating for ${uptime / 60 / 60 / 24} days`);

running node app.js will return

total memory : 17054289920
free memory: 3676168192
total cpus is 8
home directory is C:\Users\ceghap
host name is LAPTOP-L5O4B4IN
the CPU architecture is x64
the default temporary files directory is C:\Users\ceghap\AppData\Local\Temp
the os platform is win32 & the release is 10.0.19042. this os is Windows_NT type and was a Windows 10 Pro.
this machines has been operating for 3.744050925925926 days

File System Module

Module ini digunakan untuk kita berkerja dengan file dalam node. Setiap function/method yang ada dalam module ini datang dengan 2 mode. synchronous (blocking) & asynchronous (non-blocking). Secara default, nodejs adalah asynchronous. Jadi method seperti fs.writeFile adalah asynchronous. Untuk menggunakan function yang synchronous sila append ‘Sync’ kepada function tersebut. Contohnya fs.writeFileSync. Seboleh-bolehnya ELAK menggunakan function synchronous HANYA GUNAKAN asynchronous.

app.js

const fs = require('fs');

const files = fs.readdirSync('./');

console.log(files); // [ 'app.js', 'logger.js' ]

const filesAsync = fs.readdir('./', function(err, files){
  if(err) console.log('Error', err);
  console.log('Result Async', files); // Result Async [ 'app.js', 'logger.js' ]
}); 

Events module

Module ini untuk handle event dengan nodejs. Kebanyakan fungsi core nodejs adalah berdasarkan konsep event. Apa tu event? event adalah satu signal yang menyatakan sesuatu telah berlaku di dalam aplikasai kita.

Untuk kali ini aku nak bincang pasal class EventEmitter dari module event sahaja.

app.js

const EventEmitter = require("events");
const emitter = new EventEmitter();

// initialize/memulakan an event listener
// boleh juga gunakan method emitter.addListener
// tapi aku pilih emitter.on sebab fungsinya sama tapi lebih pendek :D
emitter.on("logMesej", function () {
  console.log("listener dipanggil! Yahoo!");
});

// trigger event
emitter.emit("logMesej");

Result node app.js

listener dipanggil! Yahoo!

Semasa kita emit event, selalunya kita akan hantar sekali data/payload semasa event itu di ‘trigger’.

const EventEmitter = require("events");
const emitter = new EventEmitter();

emitter.on("logMesej", function(eventArg) {
  console.log("listener dipanggil! Yahoo!", eventArg);
});

// trigger event
emitter.emit("logMesej", { id: 1, url: 'https://ashrafhensem.com'});




Contoh ‘Real world’ penggunaan EventEmitter

logger.js

const EventEmitter = require("events");
const emitter = new EventEmitter();

emitter.on("logMesej", function (eventArg) {
  console.log("listener dipanggil! Yahoo!", eventArg);
});

function log(message) {
  console.log(message);
  emitter.emit("logMesej", "Ashraf adalah seorang yang hensem!");
}

module.exports = log;

app.js

const log = require("./logger");
log("mesej ini dari function log");

Result setelah node app.js adalah seperti berikut:

mesej ini dari function log
listener dipanggil! Yahoo! Ashraf adalah seorang yang hensem

Mari kita refactor kod ini untuk lagi power

logger.js

const EventEmitter = require("events");

class Logger extends EventEmitter{
  log(message) {
    console.log(message);
    this.emit("logMesej", "Ashraf adalah seorang yang hensem!");
  }
}

module.exports = Logger;

app.js

const Logger = require("./logger")
const logger = new Logger();

logger.on("logMesej", function (eventArg) {
  console.log("listener dipanggil! Yahoo!", eventArg);
});

logger.log("mesej yang dilog");

Lebih cool & nampak pro kan? haha

mesej yang dilog
listener dipanggil! Yahoo! Ashraf adalah seorang yang hensem!

HTTP module

Module ini menjadikan node.js bertindak sebagai HTTP server. Realitinya kita hampir tidak menggunakan module ini secara terus. Tetapi melalui framework seperti express.js. Tetapi, kewujudan dan asasnya perlu diketahui juga. Jadi aku tetap rasa module ini antara yang penting untuk kita fahami.

const http = require("http");

const server = http.createServer(function (req, res) {
  if (req.url === "/") {
    res.write("Nodejs web server!");
    res.end();
  }

  if (req.url === "/api/users") {
    res.write(
      JSON.stringify([
        { id: 1, name: "Ashraf" },
        { id: 2, name: "Umar" },
        { id: 3, name: "Uthman" },
        { id: 4, name: "Ulya" },
      ])
    );
    res.end();
  }
});

server.listen(3000);

console.log("listening on port 3000");

Seperti yang aku kata, kita tidak akan menggunakan module ini secara terus di ‘real world’. Lihat kod di atas, setiap kali page baru nak di buat, kita perlu masukkan if(req.url === "page-baru") di dalam callback http.createServer(callback). Kita akan gunakan web framework sebagai 1 layer di atas module http ini. Antara web framework node.js yang popular adalah:

  • express.js (industry standard. wajib tahu untuk pemula)
  • koa.js (team yang sama buat express.bundle yang lebih kecil & lebih moden)
  • nest.js (progressive nodejs framework. modular. fav aku)
  • meteor.js (solusi lengkap utk web app, mobile app, & desktop app. tunggu meteor v2. pasti mantap!)
  • adonis.js (adaptasi dari framework PHP Laravel. SEJIBIK!)
Belanja saya kopi

Artikel lain

Fahami React Context API

Sebagai developer reactjs yang baharu macam aku, aku selalu gunakan teknik prop drilling untuk pass prop ke child component yang aku buat. Cara ini tak bagus kalau projek kita itu adalah projek yang besar. Aku tahu mengenai kewujudan react context API atau state management library lain seperti redux, mobx, recoil dan banyak lagi library untuk… Continue reading Fahami React Context API

Asas Node.js – Module Wrapper Function

Baru-baru ni aku ada update post Asas Node.js – Import/export module. Memandangkan aku dah sentuh sikit pasal module kat situ jadi aku nak sentuh juga sedikir mengenai module wrapper function. Setiap module sebenarnya tidaklah execute kod didalamnya secara terus. Contohnya: app.js “under the hood” sebenarnya content app.js akan di ‘convert’ kepada sesuatu seperti ini: Kod… Continue reading Asas Node.js – Module Wrapper Function