Простой node.js cli

464

Привет. Сделаем простой 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
 

Установка Express.js приложение на VPS с Nginx, PM2 и Ubuntu 18.04

644

0. Подготовка

Нам понадобится:

  • VPS с Ubuntu 18.04 и root доступом
  • Putty или другой SSH клиент
  • Шаблон простого Node.js + Express.js сервера (Я буду использовать этот)
  • Необязательно: домен с DNS записями с привязкой к вашему VPS

1. Создаем пользователя

Мы хотим создать нового пользователя с правами “sudo”, потому что это плохая практика использования root — пользователя в рабочей среде.

Я для примера создам пользователя с именем lukas.

# creating new user
adduser lukas# providing superuser rightsusermod -aG sudo lukas

Выйдем из терминала и залогинимся снова под новым пользователем. Так же отличная идея обновить систему

sudo apt-get update
sudo apt-get upgrade

2. Node.js

Есть много путей для установки node.js, но я предпочитаю  NVM (Node.js Version Manager). Мы установим node.js 10ой версии.

Примечание, на момент выхода перевода актуальная версия node.js 14 lts.

Мы загрузим установочный скрипт с curl (или альтернативно можно использовать wget). Так создастся папка .nvm в каталоге вашего пользователя. Внутри этой папки будут храниться ваши Node.js установки.

# this command will download install script with curl
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash# or use wget
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

Выйдем и залогинимся обратной. После этого надо убедится, что nvm стал доступен.

# check if installed
nvm --version
==> 0.33.11# list available Node.js versions
nvm ls-remote# choose one version and install it
# example of v10.4.1 installation
nvm install v10.4.1# check if installed properly
node --version
==> v10.4.1

NVM-это мощный инструмент, который позволяет устанавливать несколько версий node.js и переключаться между ними по своему усмотрению. Вы можете использовать команду “help” или обратится к документации  github page.

# check more nvm usage
nvm --help

Создаем простой сервер с Express.js

# go to your user's directory
cd /home/lukas# create folder simpleServer
mkdir simpleServer# go inside
cd simpleServer# create package.json
npm init -y# install Express.js
npm install express

Создайте файл с этим текстом внутри и сохраните его. Вы можете использовать nano или любой другой редактор.

# open nano
nano server.js# to save, press Ctrl + X ==> Y ==> Enter
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send("Hello World!");
});

const port = 3000;
const server = app.listen(port, () => {
  console.log(`Listening on http://localhost:${port}`);
});
# start server
node server.js
==> Listening on http://localhost:3000

Если вы зайдете на ваш сайт с портом 3000 (например http://dzen-code.ru:3000) , вы должны увидеть “Hello World!” в окне браузера.

3. PM2

Если вы сейчас закроете свой SSH-клиент, ваш веб-сайт перестанет работать. Нам понадобиться какой-то инструмент, который будет поддерживать наш сервер “живым”. Скажите привет PM2!

# globally install PM2
npm install pm2 -g# check if installed properly
pm2 -V
==> 2.10.4

PM2 будет поддерживать наш сервер в фоновом режиме, и если он упадет, PM2 автоматически перезапустит его.

# start our server with PM2
pm2 start server.js# check <YourVPSIpAddress>:3000 if your server is running

Сделаем запуск PM2 со стартом сервера

Если мы сейчас перезагрузим VPS, наш сервер не запустится. Сначала мы должны включить его. Документация тут.

pm2 startup
# this will generate another command that you need to run# We also need to save what processes
# should get started with pm2
pm2 save# reboot VPS and check if your website is up
sudo reboot

Как и NVM, PM2-это очень мощный инструмент, который может сделать гораздо больше, чем это. Можете ознакомится  с официальной документацие и “help” командой.

# get help!
pm2 help

4. Nginx

Установим Nginx:

sudo apt-get install nginx# check if installed
sudo nginx -v
==> nginx version: nginx/1.14.0 (Ubuntu)

Создадим конфигурационный файл нашего сервера

cd /etc/nginx/sites-availablesudo nano simpleServer

Внутрь файла поместим данный кусок кода

server {
listen 80;
server_name <YourVPSIpAddress>; location / {
proxy_pass http://localhost:3000/;
}
}

Если у вас установлен домен, то пропишите его таким образом:

# ...
server_name www.example.com example.com;
# ...

Более подробная информация Nginx documentation.

Финальные шаги

# check if your configuration is ok
sudo nginx -t# enable your configuration
sudo ln -s /etc/nginx/sites-available/simpleServer /etc/nginx/sites-enabled# restart nginx
sudo systemctl restart nginx

Ваш сервер должен быть доступен по вашему домену или ip <YourVPSIpAddress>.

Перевод https://medium.com/@panzelva/deploying-express-js-website-to-vps-with-nginx-pm2-and-ubuntu-18-04-8c5d32593211

+1
 

Запуск приложения node.js в фоновом режиме на сервере

585

Допустим у вас есть приложение или как в моем случае телеграм бот. И хочется его разместить на сервере. И в формате демона/сервиса.

Я предложу способ которым пользуюсь сам. Вообще есть несколько вариантов для этого. Н я остановился на пакете PM2.
Довольно красивая утилита и информативная.

Сначала соотвественно устанавливаем глобально пакет.

$ npm install pm2 -g

Далее заходим в директорию с нашим скриптом и через команду запускаем приложение в фоновый режим.

$ pm2 start bot.js

Ну и собственно все. Можно посмотреть наш результат. Выведется информация по запущенным приложениям.

$ pm2 list

Доп. информация соотвественно в доке https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/

0