Щоб одержати ці параметри треба виконати process.argv.slice(2), який поверне всі розділені пробілами параметри: ["param 1", "param 2", …]
Але обробляти комбінації параметрів та їх формати дуже незручно. Для цього використовують сторонні модулі. Один із найпопулярніших - commander або yargs.
Для початку ініціалізуємо проєкт:
terminal
npm init -y
Встановлюємо commander:
terminal
npm i commander
Щоб підсвічувати текст в консолі різними кольорами використовують або пакет colors або chalk.
terminal
npm i colors
Щоб використовувати інтерактивне введення в консолі на кшталт питання-відповідь, будемо використовувати стандартний модуль Node.js readline. Ініціалізація достатньо проста:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin, // введення зі стандартного потоку
output: process.stdout, // виведення у стандартний потік
});
Напишемо простий код програми, який приймає в консолі рядок, а потім виводить його:
index.js
const { program } = require("commander");
const fs = require("fs").promises;
const readline = require("readline");
require("colors");
// input/output interface
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// example how to use readline
rl.on("line", (txt) => {
console.log(`Your text is: ${txt}`);
});
У даному прикладі ми під'єднали модуль та створили екземпляр rl де в опціях передаємо потоки введення та виведення, консоль, файл і т.д. У нашому випадку ми беремо стандартні потоки та будемо працювати в консолі, де запускаємо скрипт. Обробка кожного введеного рядка відбувається через подію line.
Якщо хочемо використати пакет кольорів, щоб надати тексту певний колір треба передати його назву через крапку після рядка:
console.log(`Your text is: ${txt}`.red);
Щоб запустити цей скрипт треба виконати команду в консолі:
terminal
node index.js
Утім після початку виконання коду ми з нього не виходимо. Для того, щоб вийти знову в командний рядок треба натиснути Ctrl +C.
Якщо хочемо автоматично закінчувати і закривати скрипт після виконання, то для цього є такий метод:
process.exit();
Але найцікавіше можливість поставити користувачеві питання та отримати на нього відповідь (аналогічна функції prompt із браузера):
Також при якійсь тривалій операції можна поставити розмову на паузу (заблокувати введення):
rl.pause();
Щоб закрити інтерфейс readline, необхідно виконати функцію:
rl.close();
А тепер маючи необхідні знання - напишемо застосунок «Вгадай число». Генератор псевдовипадкових чисел "задумає" число від 1 до 10. Користувач буде вгадувати це число. Програма покаже з якої спроби вдалося вгадати число. І потім додамо можливість зберігати результати гри у файл.
index.js
// ===підключення бібліотек=== //
const { program } = require("commander");
const fs = require("fs").promises;
const readline = require("readline");
require("colors");
// ===ставимо прапорець=== //
program.option(
"-f, --file <type>",
"file for saving game results",
"game_results.txt"
);
// ===парсинг параметрів переданих в командному рядку=== //
program.parse(process.argv);
// ===інтерфейс введення/виведення через консоль=== //
// стандарний інпут і стандартний аутпут (std)
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// ===ГРА=== //
// Допоміжні функції
/**
* простий валідатор введеного числа
* @author Sasha Khomiak
* @param {number} num - value to validate
* @returns {boolean}
*/
const isValid = (num) => {
if (!Number.isNaN(num) && num > 0 && num <= 10) return true;
// Альтернативно
// if (!isNaN(num) && num > 0 && num <= 10) return true;
if (Number.isNaN(num)) console.log("Please, enter the number".red);
if (num < 1 || num > 10) console.log("Number should be between 1 and 10".red);
return false;
};
/**
* функція логування результатів гри у файл
* @param {string} msg - message to log
* @returns {Promise<void>} - returning Promice with no returning data
*/
const logger = async (msg) => {
try {
await fs.appendFile(
logFile,
`${new Date().toLocaleString("uk-UA")}: ${msg}\n`
);
console.log(`Sucsess save game results to the file ${logFile}`.yellow);
} catch (error) {
console.log(error.message);
}
};
// Лічильник спроб з якої буде вгадано число
let counter = 0;
// Згенероване випадкове число від 1 до 10 ("згадана число")
const mind = Math.ceil(Math.random() * 10);
// Шлях до лог файлу щапису результатів
// file - береться з ініціалізації прапорців в program.option (див. вище)
const logFile = program.opts().file;
// ===ГОЛОВНИЙ КОД ПРОГРАМИ=== //
const game = () => {
// Ставимо питання (аналогія prompt)
rl.question("Please enter number betwen 1 and 10:\n".green, (value) => {
// Конвертуємо рядок в число
const number = +value;
// те ж само, що і const number = Number(value);
// Валідація введеного числа
// Якщо валідацію не пройдено, то повертаємося знову до гри
if (!isValid(number)) return game();
// збільшуємо лічильник спроб на 1
counter += 1;
// Якщо число не збіглoся (не вгадали), то запускаємо наступну ітерацію гри
if (number !== mind) {
console.log("Try again".red);
return game();
}
// Якщо число збігається, то виводимо відповідне повідомлення
console.log(
`Congratulations! You guessed the number in: ${counter} step(s)`.magenta
);
// логгер, який записує результати у файл
logger(`Winning count: ${counter}`);
// завершення гри, вихід і закриття інтерфейсу введення/виведення
rl.close();
});
};
// ===ЗАПУСК ГРИ=== //
game();
Програма складається з головної функції гри, функції валідації введеного числа і функції запису результату в лог-файл. Для кольорового позначення тексту використано бібліотеку colors - достатньо через крапку вказати бажаний колір тексту.
Щоб запустити гру потрібно у терміналі виконати таку команду, де -f file.log вказує лог-файл куди будуть збережені результати гри.
terminal
node index.js -f file.log
Якщо ключ не вказати, то наші результати за замовчанням збережуться у файл game_results.txt.
Якщо вказати невалідний ключ, то буде повідомлення про помилковий ключ команди.
У коді повідомлення є такий текст \n - це перенесення "каретки" на новий рядок