การรับค่าผ่าน Command line อาร์กิวเมนต์ บน Node.js

ในการรันโปรแกรมบน Node.js คุณสามารถส่งค่าเข้าไปยังโปรแกรมผ่านทาง Command line อาร์กิวเมนต์ได้ นี่เป็นคุณสมบัติการทำงานพื้นฐานของโปรแกรมแบบ Command line ในบทนี้ คุณจะได้เรียนรู้การส่งและรับค่าผ่าน Command line อาร์กิวเมนต์เพื่อนำเข้าไปใช้งานในโปรแกรม นี่เป็นเนื้อหาในบทนี้

  • การรับค่าจาก Command line
  • การส่งหลายค่าผ่าน Command line
  • การส่งและรับค่าเป็นตัวเลข
  • การส่งค่าของช่องวาง
  • การส่งค่าตัวอักษรพิเศษ

การรับค่าจาก Command line

โดยปกติแล้วเมื่อเรารันโปรแกรมบน Node.js เราใช้คำสั่ง node ตามด้วยชื่อไฟล์ของโปรแกรมที่ต้องการรันดังนี้

node file_name.js
หรือ
node c:/path/to/file_name.js

นี่จะทำการรันโปรแกรมในไฟล์ file_name.js

ต่อไปมาดูตัวอย่างของโปรแกรมสำหรับแสดงข้อความทักทายชื่ออย่างง่ายออกทางหน้าจอ นี่เป็นโค้ดตัวอย่างของโปรแกรม hello.js

hello.js
console.log('Hello Metin');

โปรแกรมนี้ได้แสดงชื่อ "Metin" ซึ่งถูกเขียนไว้ในโค้ดออกทางหน้าจอ ในตอนนี้หากเราต้องการเปลี่ยนชื่อเป็นอย่างอื่น เราจะต้องแก้ไขโค้ดในโปรแกรมก่อนซึ่งเป็นวิธีที่ไม่ยืดหยุ่น สิ่งที่เราต้องการคือให้ชื่อนั้นสามารถเปลี่ยนแปลงค่าได้จากค่าที่ส่งเข้ามาในโปรแกรม ไม่ใช่การแก้ไขโค้ดของโปรแกรม

เพื่อทำเช่นนี้เราสามารถส่งชื่อเข้าไปในโปรแกรมได้ผ่านทาง Command line อาร์กิวเมนต์ นี่เป็นโปรแกรมที่ได้รับการปรับปรุงใหม่ให้สามารถรับค่าจาก Command line อาร์กิวเมนต์ได้

hello.js
let name = process.argv[2];
console.log('Hello ' + name);

จากนั้นในตอนรันโปรแกรม เราสามารถส่งค่าผ่าน Command line อาร์กิวเมนต์ ได้ดังนี้

node hello.js Metin

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Hello Metin

ชื่อที่ส่งผ่านทาง Command line อาร์กิวเมนต์สามารถรับได้จาก process.argv[2] และเราเก็บไว้ในตัวแปร name เพื่อนำไปแสดงผลในโปรแกรม

บน Node.js เราสามารถรับค่าที่ส่งผ่าน Command line อาร์กิวเมนต์ได้จากอาเรย์ argv ซึ่งอยู่ในออบเจ็ค process แต่คุณอาจสงสัยว่าทำไม Index ของอาเรย์นั้นจะต้องเริ่มต้นจากตำแหน่งที่ 2 มาลองแก้ไขโปรแกรมและรันมันอีกครั้ง

hello.js
let name = process.argv[2];
console.log('Hello ' + name);
console.log(process.argv);

และรันโปรแกรมด้วยคำสั่งเดิม

node hello.js Metin

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Hello Metin
[
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\marcuscode\\nodejs\\command-line-arguments\\hello.js',
  'Metin'
]

และอย่างที่คุณเห็นในผลลัพธ์ของโปรแกรม อาเรย์ argv นั้นประกอบไปด้วยสามค่าในอาเรย์ ค่าในตำแหน่งแรกคือที่อยู่ของโปรแกรม Node.js ที่เราใช้รัน ส่วนค่าในตำแหน่งที่สองคือไฟล์ของโปรแกรมที่ถูกรัน ในกรณีนี้คือ hello.js

let name = process.argv[2];

ส่วนค่าที่เราส่งเข้าไปนั้นจะเริ่มจากตำแหน่งที่สามซึ่งสามารถเข้าถึงได้จาก argv[2] ในอาเรย์เป็นต้นไป หรือกล่าวอีกนัยหนึ่ง สองตำแหน่งแรกในอาเรย์ argv เป็นค่าที่จะถูกกำหนดโดย Node.js อัตโนมัติเมื่อรันโปรแกรมนั่นเอง

การส่งหลายค่าผ่าน Command line

นอกจากนี้เราสามารถส่งมากกว่าหนึ่งค่าผ่าน Command line อาร์กิวเมนต์เข้าไปยังโปรแกรมได้ โดยคั่นแต่ละค่าด้วยช่องว่าง นี่เป็นโปรแกรมสำหรับรับชื่อของสีทั้งหมดที่ส่งเข้ามาในโปรแกรม และแสดงมันออกทางหน้าจอ

color.js
// Display only colors arguments
let colors = process.argv.slice(2);
console.log('colors:', colors);

// Display all arguments
console.log('process.argv:', process.argv);

จากนั้นรันโปรแกรมด้วยคำสั่ง

node color.js red green blue

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

colors: [ 'red', 'green', 'blue' ]
process.argv: [
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\marcuscode\\nodejs\\command-line-arguments\\color.js',
  'red',
  'green',
  'blue'
]

เราสามารถส่งค่าเข้ามายังโปรแกรมกี่จำนวนก็ได้โดยคั่นแต่ละค่าด้วยช่องว่าง โดย Node.js และอ่านและเก็บมันใส่ในอาเรย์ argv ให้กับเราอัตโนมัติโดยการนับ Index ไปเรื่อยๆ โดยเริ่มต้นจากตำแหน่งที่สองดังที่แสดงในตัวอย่าง

let colors = process.argv.slice(2);

และเช่นเดิมเราสามารถเข้าถึงค่าจากตำแหน่งใดๆ ในอาเรย์ได้ผ่านทาง Index ของมัน เช่น process.argv[3] เพื่อรับเอาค่าของสีเขียว (Green) หรือรับเอาพารามิเตอร์ที่ส่งเข้ามาในโปรแกรมทั้งหมดโดยการใช้เมธอด slice ของอาเรย์เริ่มต้นจากตำแหน่งที่สอง

การส่งและรับค่าเป็นตัวเลข

ในกรณีที่คุณต้องการส่งค่าเป็นตัวเลขผ่านทาง Command line อาร์กิวเมนต์ คุณเพียงส่ง Literal ที่ถูกต้องของตัวเลขเข้าไป แต่อย่างไรก็ตาม Node.js ประมวลผลค่าที่รับมาเป็น String เสมอ ดังนั้นเพื่อนำค่ามาใช้งานในโปรแกรม คุณจะต้องแปลงไปยังประเภทข้อมูลที่ต้องการก่อนเสมอ

นี่เป็นตัวอย่างของโปรแกรมสำหรับหาผลรวมของตัวเลขสองตัว โดยการรับค่าตัวเลขผ่านทาง Command line อาร์กิวเมนต์

sum.js
let a = Number(process.argv[2]);
let b = Number(process.argv[3]);

console.log('Sum of two numbers');
console.log(`${a} + ${b} = ${a + b}`);

และเรารันโปรแกรมด้วยคำสั่งต่อไปนี้

node sum.js 5 3

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Sum of two numbers
5 + 3 = 8

ในการรันโปรแกรม เราได้ส่งตัวเลข 5 และ 3 ผ่านทาง Command line อาร์กิวเมนต์และรับเอามันมาใช้งานผ่าน process.argv ตามปกติ และใช้ฟังก์ชัน Number เพื่อแปลง String ให้เป็นตัวเลขซึ่งเป็นประเภทข้อมูลที่ถูกต้องสำหรับโปรแกรมของเราเพื่อทำงาน

การส่งค่าของช่องว่าง

ช่องว่างใช้สำหรับแบ่งแยกแต่ละอาร์กิวเมนต์ของ Command line คุณอาจจะมีคำถามว่าถ้าหากค่าที่ต้องการส่งมีช่องว่างอยู่ด้วยจะสามารถทำได้อย่างไร เพื่อส่งค่าพร้อมกับช่องว่าง เราสามารถครอบมันด้วยเครื่องหมาย Double quote (") นี่จะทำให้ทุกอย่างที่อยู่ระหว่าง Double quote ถูกรวมเป็นเพียงค่าเดียว

นี่เป็นตัวอย่างของโปรแกรมรายงานสภาพอากาศ โดยการรับค่าเป็นชื่อของเมืองที่อาจมีช่องว่างได้

weather.js
let city = process.argv[2];
console.log(`Weather in ${city} today`);
console.log('Temperature: 30 Fahrenheit');
console.log('Humidity: 44%');
console.log('Wind: 6 km/h');

นี่เป็นวิธีที่เรารันโปรแกรม สังเกตเครื่องหมาย Double quote ครอบชื่อของเมือง

node weather.js "New York"

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Weather in New York today
Temperature: 30 Fahrenheit
Humidity: 44%
Wind: 6 km/h

ค่าของสภาพอากาศทั้งหมดที่แสดงเป็นค่าที่สมมติขึ้น ในการทำงานจริง เรามักจะรับข้อมูลการรายงานสภาพอากาศเหล่านี้มาจาก API รายงานสภาพอากาศ

การส่งค่าตัวอักษรพิเศษ

ในการส่งค่าผ่าน Command line อาร์กิวเมนต์ ตัวอักษรบางตัวถูกสงวนไว้สำหรับเพื่อเป็นไวยากรณ์ในการส่งค่าเข้าไปยังโปรแกรม ยกตัวอย่างเช่นในสิ่งที่คุณได้เรียนรู้มาแล้ว

node myScript.js "I love you"

ช่องว่างนั้นใช้เป็นตัวกำหนดเพื่อแบ่งแยกแต่ละอาร์กิวเมนต์ที่ส่งเข้าไปยังโปรแกรมผ่าน Command line เพื่อส่งค่านี้เข้าไปในโปรแกรมจริงๆ เราจะต้องครอบมันด้วยเครื่องหมาย Double quote ตอนนี้ลองจินตนาการว่าถ้าเราต้องการส่งค่าที่เป็นเครื่องหมาย Double quote เราจะทำได้อย่างไร คำตอบก็คือคุณสามารถทำเช่นนี้ได้โดยการใช้ Escape character

node myScript.js "I \"love\" you"

ในตัวอย่างนี้เราต้องการส่งข้อความว่า I "love" you โดยมีเครื่องหมาย Double quote เป็นส่วนหนึ่งของค่าที่ต้องการส่งเข้าไปในโปรแกรม โดยการใช้ Escape character \" แทน ซึ่งนี่จะหมายถึงตัวอักษรของ Double quote จริงๆ ที่ถูกส่งเข้าไปในโปรแกรม

นอกจากนี้ คุณยังสามารถใช้ Escape character สำหรับส่งค่าตัวอักษรพิเศษอื่นๆ ที่สนับสนุนในภาษา JavaScript ได้เช่นกัน เช่น \\ สำหรับตัวอักษรของ Back slash เอง เป็นต้น

ในบทนี้ คุณได้เรียนรู้เกีี่ยวกับการรับค่าผ่านทาง Command line อาร์กิวเมนต์เพื่อนำมาใช้งานในโปรแกรม ซึ่งนี่มีประโยชน์เมื่อเราต้องการเขียนโปรแกรมให้สามารถรับค่านำเข้าได้พร้อมกับตอนที่โปรแกรมถูกรันโดยที่ไม่ต้องไปแก้ไขโค้ดในโปรแกรมทุกครั้ง

การรับค่าผ่านทาง Command line อาร์กิวเมนต์เกิดขึ้นในตอนที่เริ่มต้นรันโปรแกรมเท่านั้น ถ้าหากโปรแกรมของคุณต้องการรับค่าในขณะที่โปรแกรมทำงาน (Run-time) คุณจะต้องใช้ การรับค่าจากคีย์บอร์ด บน Node.js แทน