Learn Basic NodeJS
Tags: webdev, javascript, node
Published: 2024-03-23 03:58:17


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sptu3ruemm8x2e3qkmrn.png)

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());
```

## 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));
```

## 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!");
```

## 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));
```

## 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);
```

## 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");
```

## 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);
```

## 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");
```

## 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();
});
```

## 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();
```

## 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());
```

## 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());
});
```

## 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);
```

```
import timers from "timers/promises";

console.info(new Date());
const name = await timers.setTimeout(5000, "Aditria");
console.info(new Date());
console.info(name);
```

## 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);
```

## 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);
```

## 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));
```

## 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);
```

```
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());
```

## 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);
```

## 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);
```

```
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();
});
```

## 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();
```

## 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);
```

## 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);
}
```