Skip to content

process

process เป็นโมดูลในตัวของ Node.js ที่ให้ข้อมูลและการควบคุมเกี่ยวกับกระบวนการ Node.js ที่กำลังทำงานอยู่ ทำให้สามารถเข้าถึงข้อมูลระบบ สภาพแวดล้อม และจัดการกับกระบวนการที่กำลังทำงาน

import process from 'node:process';

APIคำอธิบายลักษณะคำอธิบายเพิ่มเติม
process.argvอาร์กิวเมนต์บรรทัดคำสั่งที่ส่งเข้ามาใน processArrayใช้เข้าถึงอาร์กิวเมนต์ที่ส่งเข้ามาเมื่อรัน Node.js script
process.envตัวแปรสภาพแวดล้อมของระบบObjectเข้าถึงหรือกำหนดค่าตัวแปรสภาพแวดล้อม เช่น PATH, NODE_ENV
process.exit()จบการทำงานของ process ทันทีFunctionรับรหัสการออก (exit code) ซึ่ง 0 คือสำเร็จ ค่าอื่นคือล้มเหลว
process.cwd()คืนค่าไดเรกทอรีปัจจุบันที่ process ทำงานอยู่Functionใช้เพื่อดูว่าโปรแกรมทำงานอยู่ที่ไดเรกทอรีไหน
process.pidID ของ process ปัจจุบันNumberใช้ระบุตัวตนของ process ใน OS
process.platformแพลตฟอร์มระบบปฏิบัติการที่ Node.js ทำงานอยู่Stringเช่น 'win32', 'linux', 'darwin' (macOS)
process.nextTick()จัดการฟังก์ชันให้ทำงานในรอบ event loop ถัดไปFunctionทำงานเร็วกว่า setTimeout(fn, 0) ใช้เพื่อหลีกเลี่ยง blocking
process.on()ลงทะเบียน event listener ต่อ process eventFunctionรับฟัง events เช่น 'exit', 'uncaughtException', 'warning' เพื่อจัดการพฤติกรรม
process.stdoutStandard output streamStreamใช้สำหรับแสดงผลข้อความออกทางหน้าจอ (เทียบเท่า console.log)
process.stderrStandard error streamStreamใช้สำหรับแสดงข้อความข้อผิดพลาด
process.stdinStandard input streamStreamใช้รับข้อมูลจากผู้ใช้ผ่านทางแป้นพิมพ์
process.memoryUsage()คืนค่าข้อมูลการใช้หน่วยความจำของ processFunctionใช้ตรวจสอบการใช้หน่วยความจำของโปรแกรม
process.hrtime()เวลาที่มีความละเอียดสูง (High-resolution time)Functionใช้จับเวลาอย่างแม่นยำโดยไม่ได้รับผลกระทบจากการเปลี่ยนเวลาระบบ

ตัวอย่าง

การใช้งาน process.argv

js
// รันด้วยคำสั่ง: node script.js arg1 arg2 arg3

// แสดงรายการอาร์กิวเมนต์ทั้งหมด
console.log(process.argv);
// ผลลัพธ์: [ '/path/to/node', '/path/to/script.js', 'arg1', 'arg2', 'arg3' ]

// อาร์กิวเมนต์จริงเริ่มที่ index 2
const args = process.argv.slice(2);
console.log("อาร์กิวเมนต์ที่ผู้ใช้ส่งมา:", args);
// ผลลัพธ์: [ 'arg1', 'arg2', 'arg3' ]

// นำไปใช้ในโปรแกรม
if (args.length > 0) {
  console.log(`คุณระบุพารามิเตอร์แรกคือ: ${args[0]}`);
}

การใช้งานตัวแปรสภาพแวดล้อม (Environment Variables)

js
// แสดงค่าตัวแปรสภาพแวดล้อมทั้งหมด
// console.log(process.env); // ระวัง! อาจมีข้อมูลที่เป็นความลับ

// เข้าถึงตัวแปรสภาพแวดล้อมเฉพาะ
const nodeEnv = process.env.NODE_ENV || "development";
console.log(`แอปพลิเคชันกำลังทำงานในโหมด: ${nodeEnv}`);

// กำหนดค่าตัวแปรสภาพแวดล้อมใหม่
process.env.MY_VARIABLE = "Hello from Node.js";
console.log(`ค่าตัวแปร MY_VARIABLE: ${process.env.MY_VARIABLE}`);

// นำไปใช้กับการตั้งค่าแอปพลิเคชัน
const config = {
  port: process.env.PORT || 3000,
  dbUrl: process.env.DATABASE_URL || "mongodb://localhost:27017/myapp",
  apiKey: process.env.API_KEY || "development_key",
};

console.log("กำลังเริ่มเซิร์ฟเวอร์บนพอร์ต:", config.port);

การใช้งาน process.exit

js
// ฟังก์ชันที่ตรวจสอบเงื่อนไขเริ่มต้นของแอปพลิเคชัน
function checkAppRequirements() {
  if (!process.env.API_KEY) {
    console.error("ข้อผิดพลาด: ไม่พบ API key จำเป็นต้องกำหนดตัวแปร API_KEY");
    process.exit(1); // จบการทำงานด้วยรหัสข้อผิดพลาด
  }

  if (!process.env.DATABASE_URL) {
    console.error("ข้อผิดพลาด: ไม่พบ DATABASE_URL");
    process.exit(2); // รหัสข้อผิดพลาดที่ต่างกัน ช่วยในการระบุปัญหา
  }

  console.log("การตรวจสอบสำเร็จ กำลังเริ่มแอปพลิเคชัน...");
}

// เมื่อโปรแกรมเสร็จสิ้นทุกอย่างแล้ว
function shutdownApp() {
  console.log("กำลังปิดแอปพลิเคชัน...");
  // ทำงานจนเสร็จ เช่น ปิดการเชื่อมต่อฐานข้อมูล บันทึกข้อมูล
  process.exit(0); // จบการทำงานแบบปกติด้วยรหัสสำเร็จ
}

การจัดการเหตุการณ์ (Events) ของ process

js
// รับฟังเหตุการณ์เมื่อโปรแกรมจบการทำงาน
process.on("exit", (code) => {
  console.log(`โปรแกรมกำลังจบการทำงานด้วยรหัส: ${code}`);
  // หมายเหตุ: โค้ดที่นี่ต้องเป็น synchronous เท่านั้น
  // ไม่สามารถใช้ setTimeout หรือ async code อื่นๆ ได้
});

// จัดการข้อผิดพลาดที่ไม่ได้รับการจัดการ
process.on("uncaughtException", (err) => {
  console.error("เกิดข้อผิดพลาดที่ไม่ได้รับการจัดการ:", err);
  // บันทึกข้อผิดพลาดไปยังบริการติดตามข้อผิดพลาด
  // logErrorToService(err);

  // จบการทำงานของโปรแกรมเนื่องจากอาจอยู่ในสถานะไม่สมบูรณ์
  process.exit(1);
});

// จัดการเหตุการณ์ unhandledRejection (Promise ที่ไม่ได้จัดการ)
process.on("unhandledRejection", (reason, promise) => {
  console.error("Promise ไม่ได้รับการจัดการ:", reason);
  // logErrorToService({ reason, promise });
  // ในสภาพแวดล้อมการผลิต คุณอาจต้องการปิดแอปพลิเคชัน
  // process.exit(1);
});

// เมื่อได้รับสัญญาณ SIGINT (Ctrl+C)
process.on("SIGINT", () => {
  console.log("ได้รับสัญญาณ SIGINT (Ctrl+C) กำลังปิดการทำงาน...");
  // ทำงานก่อนปิด เช่น ปิดการเชื่อมต่อฐานข้อมูล
  // closeConnections();
  process.exit(0);
});

// สร้างข้อผิดพลาดเพื่อทดสอบ
// setTimeout(() => {
//   throw new Error('ทดสอบ uncaughtException');
// }, 1000);

การใช้ process.nextTick

js
console.log("1. เริ่มต้น");

process.nextTick(() => {
  console.log("4. นี่จะทำงานหลังจากสิ้นสุดรอบปัจจุบัน แต่ก่อนรอบถัดไป");
});

setTimeout(() => {
  console.log("5. นี่จะทำงานหลังจาก nextTick");
}, 0);

Promise.resolve().then(() => {
  console.log("3. นี่คือ microtask จาก Promise");
});

console.log("2. สิ้นสุด");

// ผลลัพธ์ที่คาดหวัง:
// 1. เริ่มต้น
// 2. สิ้นสุด
// 3. นี่คือ microtask จาก Promise
// 4. นี่จะทำงานหลังจากสิ้นสุดรอบปัจจุบัน แต่ก่อนรอบถัดไป
// 5. นี่จะทำงานหลังจาก nextTick

การใช้ stdin, stdout และ stderr

js
// แสดงข้อความผ่าน stdout
process.stdout.write("โปรดป้อนชื่อของคุณ: ");

// รับข้อมูลจาก stdin
process.stdin.on("data", (data) => {
  const name = data.toString().trim();

  if (name === "") {
    // แสดงข้อผิดพลาดผ่าน stderr
    process.stderr.write("ข้อผิดพลาด: ชื่อต้องไม่ว่างเปล่า\n");
    process.stdout.write("โปรดป้อนชื่อของคุณอีกครั้ง: ");
    return;
  }

  process.stdout.write(`สวัสดี, ${name}!\n`);
  process.exit(0);
});

การตรวจสอบการใช้หน่วยความจำ

js
// แสดงข้อมูลการใช้หน่วยความจำปัจจุบัน
function displayMemoryUsage() {
  const memoryUsage = process.memoryUsage();

  // แปลงเป็น MB สำหรับการแสดงผลที่อ่านง่ายขึ้น
  const formatMemoryUsage = (data) =>
    `${Math.round(data / 1024 / 1024 * 100) / 100} MB`;

  console.log("การใช้หน่วยความจำ:");
  console.log(
    `- RSS: ${
      formatMemoryUsage(memoryUsage.rss)
    } (Resident Set Size - หน่วยความจำทั้งหมดที่จัดสรรให้กับกระบวนการ)`,
  );
  console.log(
    `- Heap Total: ${
      formatMemoryUsage(memoryUsage.heapTotal)
    } (พื้นที่ Heap ทั้งหมดที่จัดสรร)`,
  );
  console.log(
    `- Heap Used: ${
      formatMemoryUsage(memoryUsage.heapUsed)
    } (พื้นที่ Heap ที่ใช้งานจริง)`,
  );
  console.log(
    `- External: ${
      formatMemoryUsage(memoryUsage.external)
    } (หน่วยความจำที่ใช้โดย V8 สำหรับ C++ อ็อบเจกต์)`,
  );
}

// เรียกดูการใช้หน่วยความจำทุก 5 วินาที
displayMemoryUsage();

// สร้างข้อมูลเพื่อทดสอบการใช้หน่วยความจำ
let arr = [];
setInterval(() => {
  // เพิ่มข้อมูลใหม่ทุก 1 วินาที (จะเห็นการเพิ่มขึ้นของการใช้หน่วยความจำ)
  arr.push(new Array(1000000).fill("test"));
  displayMemoryUsage();
}, 1000);