Learn Basic NodeJS

appardana

Aditria Pardana

Posted on March 23, 2024

Learn Basic NodeJS

Image description

by default JS itu berjalan di Asyncronus, JS tidak bisa membaca package, karna dia berjalan di server component, makanya jika ingin import module maka harus extension .mjs

OS

The node:os module provides operating system-related utility methods and properties. It can be accessed using: OS | Node.js v21.7.1 Documentation (nodejs.org)

import os from "os";

console.info(os.platform());
console.info(os.arch());
console.table(os.cpus());
console.info(os.uptime());
console.info(os.totalmem());
console.info(os.freemem());
console.info(os.hostname());
console.info(os.homedir());
Enter fullscreen mode Exit fullscreen mode

Path

untuk brakedown file, contoh: Path | Node.js v21.7.1 Documentation (nodejs.org)

import path from "path"; 
const file = "/Users/aditria/contoh.txt"; 

console.info(path.dirname(file)); 
console.info(path.basename(file)); 
console.info(path.extname(file));
Enter fullscreen mode Exit fullscreen mode

File System

untuk cek file, seperti read, write, copy, chmod, chown dll File system | Node.js v21.7.1 Documentation (nodejs.org)

import fs from "fs/promises";

const buffer = await fs.readFile("file-system.mjs");
console.info(buffer.toString());

await fs.writeFile("hello.txt", "Hello NodeJS!");
Enter fullscreen mode Exit fullscreen mode

Debugger

fitur ini sangat cocok untuk ngeTrace variable di berbagai macam function. Debugger | Node.js v21.7.1 Documentation (nodejs.org)

function sayHello(name) {
  debugger;
  return `Hello ${name}`;
}

const name = "Aditria";
console.info(sayHello(name));
Enter fullscreen mode Exit fullscreen mode

DNS

untuk melihat Domain Name Server kita baik di server ataupun local DNS | Node.js v21.7.1 Documentation (nodejs.org)

import dns from "dns/promises";

const ip = await dns.lookup("www.appardana.com");
console.info(ip);
Enter fullscreen mode Exit fullscreen mode

Events

Events adalah standard library di NodeJS yang bisa digunakan sebagai implementasi Event Listener. Di dalam Events, terdapat sebuah class bernama EventEmitter yang bisa digunakan untuk menampung data listener per jenis event. Events | Node.js v21.7.1 Documentation (nodejs.org)

import { EventEmitter } from "events";

const emitter = new EventEmitter();

emitter.addListener("hello", (name) => {
  console.info(`Hello ${name}`);
});

emitter.addListener("hello", (name) => {
  console.info(`Halo ${name} again`);
});

emitter.emit("hello", "Aditria");
Enter fullscreen mode Exit fullscreen mode

Globals

Di dalam NodeJS, terdapat library berupa variable atau function yang secara global bisa diakses dimana saja, tanpa harus melakukan import Global objects | Node.js v21.7.1 Documentation (nodejs.org)

setTimeout(() => {
  console.log("hello globals");
}, 3000);
Enter fullscreen mode Exit fullscreen mode

Process

Process merupakan standard library yang digunakan untuk mendapatkan informasi proses NodeJS yang sedang berjalan. Process juga merupakan instance dari EventEmitter, sehingga kita bisa menambahkan listener kedalam Process | Node.js v21.7.1 Documentation (nodejs.org)

import process from "process";

process.addListener("exit", (exitCode) => {
  console.info(`Process exit with code ${exitCode}`);
});

console.info(process.version);
console.table(process.argv);
console.table(process.report);

process.exit(1);
console.info("Not printed because process exited");
Enter fullscreen mode Exit fullscreen mode

Readline

Readline merupakan standard library yang digunakan untuk membaca input Readline | Node.js v18.19.1 Documentation (nodejs.org)

import readline from "readline";
import process from "process";

const input = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

input.question("What is your name? ", (name) => {
  console.info(`Hello ${name}`);
  input.close();
});
Enter fullscreen mode Exit fullscreen mode

Report

Report merupakan fitur yang terdapat di NodeJS untuk membuat laporan secara otomatis dalam file ketika sesuatu terjadi pada aplikasi NodeJS kita Diagnostic report | Node.js v18.19.1 Documentation (nodejs.org)

import process from "process";

process.report.reportOnFatalError = true;
process.report.reportOnUncaughtException = true;
process.report.reportOnSignal = true;
process.report.filename = "report.json";

function sampleError() {
  throw new Error("Ups");
}

sampleError();
Enter fullscreen mode Exit fullscreen mode

Buffer

Buffer merupakan object yang berisikan urutan byte dengan panjang tetap. Buffer merupakan turunan dari tipe data Uint8Array Buffer | Node.js v18.19.1 Documentation (nodejs.org)

const buffer = Buffer.from("Aditria Pardana", "utf8");
console.info(buffer);
console.info(buffer.toString("base64"));
console.info(buffer.toString("hex"));

buffer.reverse();
console.info(buffer);
console.info(buffer.toString());

const buffer2 = Buffer.from("Aditria Pardana", "base64");
console.info(buffer2);
console.info(buffer2.toString());
Enter fullscreen mode Exit fullscreen mode

Stream

Stream adalah standard library untuk kontrak aliran data di NodeJS. Ada banyak sekali Stream object di NodeJS. Stream bisa jadi object yang bisa dibaca, atau bisa di tulis, dan Stream adalah turunan dari EventEmitter https://nodejs.org/docs/latest-v18.x/api/stream.html

import fs, { read, write } from "fs";

const writer = fs.createWriteStream("target.log");

writer.write("Aditria\n");
writer.write("Pardana\n");
writer.end();

const reader = fs.createReadStream("target.log");
reader.addListener("data", (data) => {
  console.info(data.toString());
});
Enter fullscreen mode Exit fullscreen mode

Timer

Timer merupakan standard library untuk melakukan scheduling. Function di Timer terdapat di globals, sehingga kita bisa menggunakannya tanpa melakukan import, namun semua function Timer menggunakan Callback https://nodejs.org/docs/latest-v18.x/api/timers.html

setTimeout(() => {
  console.info(`hello timer ${new Date()}`);
}, 1000);
Enter fullscreen mode Exit fullscreen mode
import timers from "timers/promises";

console.info(new Date());
const name = await timers.setTimeout(5000, "Aditria");
console.info(new Date());
console.info(name);
Enter fullscreen mode Exit fullscreen mode

Net

Net merupakan standard library yang bisa digunakan untuk membuat network client dan server berbasis TCP. Net Server dan Client merupakan object Stream, sehingga kita bisa baca datanya, tulis datanya dan juga menambahkan listener https://nodejs.org/docs/latest-v18.x/api/net.html

import net from "net";

const server = net.createServer((client) => {
  console.info("Client connected");
  client.addListener("data", (data) => {
    console.info(`Receieve data ${data.toString()}`);
    client.write(`Hello ${data.toString()}\r\n`);
  });
});

server.listen(3000, "localhost");
import net from "net";

const client = net.createConnection({ port: 3000, host: "localhost" });

client.addListener("data", (data) => {
  console.info(`Receieve data from server ${data.toString()}`);
});

setInterval(() => {
  client.write("Aditria\r\n");
}, 2000);
Enter fullscreen mode Exit fullscreen mode

URL

URL merupakan standard library untuk bekerja dengan URL https://nodejs.org/docs/latest-v18.x/api/url.html

import { URL } from "url";

const pzn = new URL("https://www.programmerzamannow.com/belajar?kelas=nodejs");

pzn.host = "www.aditria.com";
pzn.searchParams.append("status", "premium");

console.info(pzn.toString());
console.info(pzn.href);
console.info(pzn.protocol);
console.info(pzn.host);
console.info(pzn.pathname);
console.info(pzn.searchParams);
Enter fullscreen mode Exit fullscreen mode

Utils

Util adalah standard library yang berisikan utility-utility yang bisa kita gunakan untuk mempermudah pembuatan kode program di NodeJS https://nodejs.org/docs/latest-v18.x/api/util.html

import util from "util";

const firstName = "Aditria";
const lastName = "Pardana";

console.info(`Hello ${firstName} ${lastName}`);
console.info(util.format("Hello %s %s", firstName, lastName));

const person = {
  firstName: "Aditria",
  lastName: "Pardana",
};

console.info(`Person : ${JSON.stringify(person)}`);
console.info(util.format("Person : %j", person));
Enter fullscreen mode Exit fullscreen mode

Zlib

Zlib adalah standard library yang digunakan untuk melakukan kompresi menggunakan Gzip https://nodejs.org/docs/latest-v18.x/api/zlib.html

import fs from "fs";
import zlib from "zlib";

const source = fs.readFileSync("zlib-compress.mjs");
const result = zlib.gzipSync(source);

fs.writeFileSync("zlib-compress.mjs.txt", result);
Enter fullscreen mode Exit fullscreen mode
import fs from "fs";
import zlib from "zlib";

const source = fs.readFileSync("zlib-compress.mjs.txt");
console.info(source.toString());

const result = zlib.unzipSync(source);
console.info(result.toString());
Enter fullscreen mode Exit fullscreen mode

Console

Console adalah standard library yang sudah sering kita gunakan. Secara global, object console bisa kita gunakan tanpa harus melakukan import module, dan console melakukan print text nya ke stdout https://nodejs.org/docs/latest-v18.x/api/console.html

import fs from "fs";
import { Console } from "console";

const file = fs.createWriteStream("console.log");
const log = new Console({
  stdout: file,
  stderr: file,
});

log.info("Hello Aditria");
log.error("Hello Pardana");

const person = {
  firstName: "Aditria",
  lastName: "Pardana",
};

log.table(person);
Enter fullscreen mode Exit fullscreen mode

Worker Threads

Worker Threads adalah standard library yang bisa kita gunakan untuk menggunakan thread ketika mengeksekusi JavaScript secara paralel. Worker Threads sangat cocok ketika kita membuat kode program yang butuh jalan secara paralel, dan biasanya kasusnya adalah ketika kode program kita membutuhkan proses yang CPU intensive, seperti misalnya enkripsi atau kompresi. Cara kerja Worker Threads mirip dengan Web Worker di JavaScript Web API https://nodejs.org/docs/latest-v18.x/api/worker_threads.html

import { threadId, Worker } from "worker_threads";

const worker1 = new Worker("./worker.mjs");
const worker2 = new Worker("./worker.mjs");

worker1.addListener("message", (data) => {
  console.info(`Thread-${threadId} receive from worker 1 : ${data}`);
});

worker2.addListener("message", (data) => {
  console.info(`Thread-${threadId} receive from worker 2 : ${data}`);
});

worker1.postMessage(5);
worker2.postMessage(10);
Enter fullscreen mode Exit fullscreen mode
import { threadId, parentPort } from "worker_threads";

parentPort.addListener("message", (data) => {
  for (let i = 0; i < data; i++) {
    console.info(`Thread-${threadId} send message ${i}`);
    parentPort.postMessage(i);
  }
  parentPort.close();
});
Enter fullscreen mode Exit fullscreen mode

HTTP Client

NodeJS juga memiliki standard library untuk HTTP. Salah satu fitur di module HTTP adalah HTTP Client, dimana kita bisa melakukan simulasi HTTP Request menggunakan NodeJS. Terdapat 2 jenis module HTTP di NodeJS, HTTP dan HTTPS :
https://nodejs.org/docs/latest-v18.x/api/http.html
https://nodejs.org/docs/latest-v18.x/api/https.html

import https from "https";

const endpoint = "https://hookb.in/1gmEeY3JLZhd6N00616L";
const request = https.request(
  endpoint,
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      accept: "application/json",
    },
  },
  (response) => {
    response.addListener("data", (data) => {
      console.info(`Receive data : ${data.toString()}`);
    });
  }
);

const body = JSON.stringify({
  firstName: "Aditria",
  lastName: "Pardana",
});

request.write(body);
request.end();
Enter fullscreen mode Exit fullscreen mode

HTTP Server

Standard Library HTTP juga tidak hanya bisa digunakan untuk membuat HTTP Client, tapi juga bisa digunakan untuk membuat HTTP Server. Untuk kasus sederhana, cocok sekali jika ingin membuat HTTP Server menggunakan standard library NodeJS, namun untuk kasus yang lebih kompleks, direkomendasikan menggunakan library atau framework yang lebih mudah penggunaannya https://nodejs.org/docs/latest-v18.x/api/http.html#class-httpserver

import http from "http";

const server = http.createServer((request, response) => {
  console.info(request.method);
  console.info(request.url);
  console.info(request.statusCode);

  if (request.method === "POST") {
    request.addListener("data", (data) => {
      response.setHeader("Content-Type", "application/json");
      response.write(data);
      response.write("Success from Server");
      response.end();
    });
  } else {
    if (request.url === "/aditria") {
      response.write("Hello Aditria");
    } else {
      response.write("Hello HTTP Server");
    }
    response.end();
  }
});

server.listen(3000);
Enter fullscreen mode Exit fullscreen mode

Cluster

Seperti yang dijelaskan di awal, bahwa NodeJS itu secara default dia berjalan single thread, kecuali jika kita membuat thread manual menggunakan worker thread, tapi tetap dalam satu process. NodeJS memiliki standard library bernama Cluster, dimana kita bisa menjalankan beberapa process NodeJS secara sekaligus. Ini sangat cocok ketika kita menggunakan CPU yang multicore, sehingga semua core bisa kita utilisasi dengan baik, misal kita jalankan process NodeJS sejumlah CPU core. Di dalam Cluster, terdapat 2 jenis aplikasi, Primary dan Worker. Primary biasanya digunakan sebagai koordinator atau manajer untuk para Worker. Sedangkan Worker sendiri adalah aplikasi yang menjalankan tugas nya https://nodejs.org/docs/latest-v18.x/api/cluster.html

import cluster from "cluster";
import http from "http";
import os from "os";
import process from "process";

if (cluster.isPrimary) {
  //jalankan worker
  console.info(`Primary ${process.pid} is running`);

  for (let i = 0; i < os.cpus().length; i++) {
    cluster.fork();
  }

  cluster.addListener("exit", (worker) => {
    console.info(`Worker ${worker.id} is exited`);
    cluster.fork();
  });
}

if (cluster.isWorker) {
  console.info(`Worker ${process.pid} started`);

  const server = http.createServer((request, response) => {
    response.write(`Hello from worker ${process.pid}`);
    response.end();
    process.exit();
  });

  server.listen(3000);
}
Enter fullscreen mode Exit fullscreen mode
💖 💪 🙅 🚩
appardana
Aditria Pardana

Posted on March 23, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related