Простой node.js cli

236
0
236

Привет. Сделаем простой node.js cli. У меня к примеру были задачи, что для какого скрипта надо было установить ряд настроек перед запуском. Собственно для сбора настроек я и решил воспользоваться простым терминальным интерфейсом.

Вначале я использовал стандартный модуль https://nodejsdev.ru/api/readline/. Но мне захотелось чуть более продвинутый интерфейс.

Давайте создадим простое приложение для расчета ИМТ(индекс массы тела).

Для этого мы будем использовать модуль inquirer.

Создаем проект. Устанавливаем модуль и вставляем изначальный шаблон. У меня это будет файл imt.js.

npm init
npm install inquirer
var inquirer = require('inquirer');
inquirer
  .prompt([
    /* Pass your questions in here */
  ])
  .then((answers) => {
    // Use user feedback for... whatever!!
  })

Отлично.
Первый блок это блок вопросов. В нем мы описываем наши вопросы в виде массива объектов. Вопросы бывают разного типа.

Допустим мы спросим про имя (это будет строка), про пол (селект), рост (будет число) и вес (тоже будет число).

Вот что у нас получается.

var inquirer = require('inquirer');
inquirer
  .prompt([
    {
        type: 'input',
        name: 'name',
        message: 'What your name?',
        default: 'noname'
    }, 
    {
        type: 'list',
        name: 'gender',
        message: 'Choose a gender',
        choices: ['male', 'female'],
        default: 'nogender'
    },
    {
        type: 'number',
        name: 'height',
        message: 'What is your height',
        default: '0'
    }, 
    {
        type: 'number',
        name: 'weight',
        message: 'What is your weight(kg)?',
        default: '0'
    }, 
    

  ])
  .then((answers) => {
    // Use user feedback for... whatever!!
    console.log(answers)
  })
  

Можем запустить код и посмотреть.

node imt.js

Мой результат

Отлично. На выходе мы получили console.log c объектом данных которые мы заполнили. У нас в вопросах есть поле default, как не сложно догадаться это значение, которое выставляет, если ответ был пропущен. Что ж давайте сделаем простую валидацию, чтобы все поля были обязательны для заполнения.

Для этого измени некоторые default значения, и воспользуемся методом validate. Это функция, параметром которого является наш ответ на вопрос, а тело собственно проверка. Если проверка пройдена то возвращаем true.

var inquirer = require('inquirer');
inquirer
  .prompt([
    {
        type: 'input',
        name: 'name',
        message: 'What your name?',
        default: '',
        validate: async (input) => {
            if (input == '' ) {
               return 'Please tell me your name';
            }
            return true;
         }
    }, 
    {
        type: 'list',
        name: 'gender',
        message: 'Choose a gender',
        choices: ['male', 'female'],
        default: null,
    },
    {
        type: 'number',
        name: 'height',
        message: 'What is your height(cm)',
        default: 0,
        validate: async (input) => {
            if (input == 0 ) {
               return 'Please indicate your height in centimeters';
            }
            return true;
         }
    }, 
    {
        type: 'number',
        name: 'weight',
        message: 'What is your weight(kg)?',
        default: 0,
        validate: async (input) => {
            if (input == 0 ) {
               return 'Please indicate your weight in kilograms';
            }
            return true;
         }
    }, 
    

  ])
  .then((answers) => {
    // Use user feedback for... whatever!!
    console.log(answers)
  })
  

Теперь у нас появилась проверка

Почти все. Осталось добавить формулу рассчета массы тела из получившихся данных.

  1. Необходимо рассчитать индекс массы тела для мужчины ростом 185 см, вес которого равен 94 кг.
  2. Расчет ИМТ начнем с возведения роста в метрах в квадрат (для этого необходимо умножить число на само себя): 1,85×1,85=3,4225.
  3. Разделим вес в килограммах на полученное значение: I=94/3,4225=27,47.

Выведем индекс и заключение.

var inquirer = require('inquirer');
inquirer
  .prompt([
    {
        type: 'input',
        name: 'name',
        message: 'What your name?',
        default: '',
        validate: async (input) => {
            if (input == '' ) {
               return 'Please tell me your name';
            }
            return true;
         }
    }, 
    {
        type: 'list',
        name: 'gender',
        message: 'Choose a gender',
        choices: ['male', 'female'],
        default: null,
    },
    {
        type: 'number',
        name: 'height',
        message: 'What is your height(cm)',
        default: 0,
        validate: async (input) => {
            if (input == 0 ) {
               return 'Please indicate your height in centimeters';
            }
            return true;
         }
    }, 
    {
        type: 'number',
        name: 'weight',
        message: 'What is your weight(kg)?',
        default: 0,
        validate: async (input) => {
            if (input == 0 ) {
               return 'Please indicate your weight in kilograms';
            }
            return true;
         }
    }, 
    

  ])
  .then((answers) => {
    // Use user feedback for... whatever!!
    console.log(answers)
    let squareHeight =  Math.pow((answers.height/100), 2)
    let index = answers.weight/squareHeight

    console.log('Your index ', index)
    if(index < 16) console.log('Pronounced lack of body weight')
    if(index > 16 && index < 18.5) console.log('Body weight deficit')
    if(index > 18.5 && index < 25) console.log('Normal weight')
    if(index > 25 && index < 30) console.log('Pre-obesity')
    if(index > 30 && index < 35) console.log('First-degree obesity')
    if(index > 35 && index < 42) console.log('Second-degree obesity')
    if(index > 42 ) console.log('Third-degree obesity')
   
  })
  

Наш итоговый результат

0