Skip to content

Core Concepts of Node.js (แนวคิดหลักของ Node.js)

Event Loop (ลูปเหตุการณ์)

Event Loop เป็นหัวใจสำคัญของ Node.js ที่ทำให้ทำงานแบบ Non-blocking I/O ได้ โดยใช้หลักการ Single-threaded แต่รองรับการทำงานแบบ Asynchronous

javascript
// ตัวอย่างการทำงานแบบ Asynchronous
const fs = require("fs");

fs.readFile("file.txt", "utf8", (err, data) => {
  if (err) throw err;
  console.log(data);
});

console.log("ทำงานต่อไปได้ทันทีโดยไม่ต้องรอ");

Modules System (ระบบโมดูล)

Node.js ใช้ระบบโมดูลแบบ CommonJS ทำให้สามารถแบ่งโค้ดออกเป็นส่วนๆ และนำกลับมาใช้ใหม่ได้

javascript
// math.js
module.exports = {
  add: (a, b) => a + b,
  subtract: (a, b) => a - b,
};

// app.js
const math = require("./math");
console.log(math.add(2, 3)); // 5

ES Modules

Node.js รองรับ ES Modules (แบบใหม่) ด้วย

javascript
// math.mjs
export function add(a, b) {
  return a + b;
}

// app.mjs
import { add } from "./math.mjs";
console.log(add(2, 3)); // 5

Asynchronous Programming (การเขียนโปรแกรมแบบ Async)

Node.js เน้นการทำงานแบบ Asynchronous ด้วย 3 วิธีหลัก:

1. Callbacks

javascript
const fs = require("fs");

fs.readFile("file.txt", "utf8", (err, data) => {
  if (err) return console.error(err);
  console.log(data);
});

2. Promises

javascript
const fs = require("fs").promises;

fs.readFile("file.txt", "utf8")
  .then(data => console.log(data))
  .catch(err => console.error(err));

3. Async/Await

javascript
async function readFile() {
  try {
    const data = await fs.promises.readFile("file.txt", "utf8");
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

readFile();

Streams (สตรีม)

ช่วยจัดการข้อมูลขนาดใหญ่โดยไม่ต้องโหลดทั้งหมดเข้าหน่วยความจำ

javascript
const fs = require("fs");

const readStream = fs.createReadStream("largefile.txt");
const writeStream = fs.createWriteStream("output.txt");

readStream.pipe(writeStream);

Buffer (บัฟเฟอร์)

ใช้จัดการข้อมูล Binary ใน Node.js

javascript
const buf = Buffer.from("Hello World", "utf8");
console.log(buf.toString("hex")); // แสดงผลในรูปแบบ HEX

Error Handling (การจัดการข้อผิดพลาด)

javascript
// แบบ Synchronous
try {
  JSON.parse("invalid json");
} catch (err) {
  console.error(err);
}

// แบบ Asynchronous
fs.readFile("nonexistent.txt", (err, data) => {
  if (err) {
    console.error("เกิดข้อผิดพลาด:", err.message);
    return;
  }
  console.log(data);
});

Child Processes (กระบวนการย่อย)

ช่วยให้รันคำสั่งหรือสคริปต์อื่นๆ ขนานกันได้

javascript
const { exec } = require("child_process");

exec("ls -la", (error, stdout, stderr) => {
  if (error) {
    console.error(`error: ${error.message}`);
    return;
  }
  console.log(stdout);
});

Cluster (คลัสเตอร์)

ช่วยใช้ประโยชน์จาก CPU หลาย core

javascript
const cluster = require("cluster");
const http = require("http");
const numCPUs = require("os").cpus().length;

if (cluster.isPrimary) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end("Hello World");
  }).listen(8000);
}