Dark mode
process
process เป็นโมดูลในตัวของ Node.js ที่ให้ข้อมูลและการควบคุมเกี่ยวกับกระบวนการ Node.js ที่กำลังทำงานอยู่ ทำให้สามารถเข้าถึงข้อมูลระบบ สภาพแวดล้อม และจัดการกับกระบวนการที่กำลังทำงาน
import process from 'node:process';
API | คำอธิบาย | ลักษณะ | คำอธิบายเพิ่มเติม |
---|---|---|---|
process.argv | อาร์กิวเมนต์บรรทัดคำสั่งที่ส่งเข้ามาใน process | Array | ใช้เข้าถึงอาร์กิวเมนต์ที่ส่งเข้ามาเมื่อรัน Node.js script |
process.env | ตัวแปรสภาพแวดล้อมของระบบ | Object | เข้าถึงหรือกำหนดค่าตัวแปรสภาพแวดล้อม เช่น PATH, NODE_ENV |
process.exit() | จบการทำงานของ process ทันที | Function | รับรหัสการออก (exit code) ซึ่ง 0 คือสำเร็จ ค่าอื่นคือล้มเหลว |
process.cwd() | คืนค่าไดเรกทอรีปัจจุบันที่ process ทำงานอยู่ | Function | ใช้เพื่อดูว่าโปรแกรมทำงานอยู่ที่ไดเรกทอรีไหน |
process.pid | ID ของ 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 event | Function | รับฟัง events เช่น 'exit', 'uncaughtException', 'warning' เพื่อจัดการพฤติกรรม |
process.stdout | Standard output stream | Stream | ใช้สำหรับแสดงผลข้อความออกทางหน้าจอ (เทียบเท่า console.log) |
process.stderr | Standard error stream | Stream | ใช้สำหรับแสดงข้อความข้อผิดพลาด |
process.stdin | Standard input stream | Stream | ใช้รับข้อมูลจากผู้ใช้ผ่านทางแป้นพิมพ์ |
process.memoryUsage() | คืนค่าข้อมูลการใช้หน่วยความจำของ process | Function | ใช้ตรวจสอบการใช้หน่วยความจำของโปรแกรม |
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);