👾
Node.js
  • 🧑‍💻Full-Stack Web Developer
  • 📚Теорія
    • 1️⃣Основи Node.js
      • Вступ
      • Модулі Node.js
      • Запуск скриптів модулів в Node.js
      • Структура проєкту, експорт-імпорт, index.js як хаб
      • Модулі CommonJS
      • Модулі MJS
      • Модулі ECMAScript
      • Модулі NPM + базові модулі
      • Глобальні змінні
      • Робота з файлами
    • 2️⃣Консольні додатки
      • Створення консольних додатків
    • 3️⃣Фреймворк Express
      • Про Express
      • Nodemon і запуски скриптів
      • Postman
      • Проміжне ПЗ middleware
      • Передача даних на сервер
      • Роутінг
      • CRUD
      • Налаштування лінтера
    • 4️⃣REST API
      • Змінні оточення
      • Логування
      • REST
      • Методи HTTP
      • CORS
      • Формування URL для REST API
      • Контроллери відсутнього роуту і непередбачуваної помилки
      • Валідація даних Joi
      • Рефакторинг додатку за MVC архітектурою
      • Express автогенератор додатку
    • 5️⃣База даних Mongo.DB
      • Основи MongoDB
      • Налаштування Mongo Atlas
      • Встановлення локальної MongoDB і основні команди
    • 6️⃣ODM Mongoose
      • Mongoose
      • Порядок планування бекенд додатку
      • чорнетка
    • 7️⃣Автентифякація WJT
      • чорнетка
      • чорнетка 2
    • 8️⃣Файли
      • чернетка
    • 9️⃣тестування
      • чернетка
    • 🔟Page 14
      • імейли
    • чорнетка докер
    • чорнетка сокети
    • додаткові матеріали
    • 👷Практика
      • 1️⃣Page 4
      • 2️⃣Page 5
      • 3️⃣Page 6
      • 4️⃣Page 7
      • 5️⃣Page 8
      • 6️⃣Page 9
  • Про мене
    • Про мене
Powered by GitBook
On this page
  1. Теорія
  2. Консольні додатки

Створення консольних додатків

Традиційний спосіб керування консольним додатком (CLI applications) - це передача параметрів з консольного рядка під час його запуску.

Скорочення CLI (command-line interface) перекладається як "інтерфейс командного рядка".

Передані параметри під час запуску скрипту доступні в масиві process.args:

terminal
["node", "/…/youscript.js", "param 1", "param 2", …]

Щоб одержати ці параметри треба виконати 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.question('Як вас звати?', answer => {
  console.log(`Приємно познайомитися ${answer}`);
});

Також при якійсь тривалій операції можна поставити розмову на паузу (заблокувати введення):

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 - це перенесення "каретки" на новий рядок

Покликання:

PreviousКонсольні додаткиNextФреймворк Express

Last updated 1 year ago

📚
2️⃣
NPM commander
NPM yargs
NPM colors
NPM chalk
Docs readline