Всё о web

Для чайников и не только


Express API сервер Часть 3, process manager

Декабрь 25, 2016

Сейчас у нас есть практически готовый проект. Мы принимаем запросы, отправляем ответы, есть немного тестов и вроде всё ок. Но в продакшен нам ещё рано. Давайте создадим гипотетическую ситуацию, например, у нас есть в коде ошибка, приводящая к падению проекта, о которой мы типа не знаем.

Создадим новый экшен shit.js

'use strict'

module.exports = class Shit {
 
  response(ws, data) {
    execUnknownFunction()
  }
  
}

И незабудем его добавить в рутер:

'use strict'

const RandomString = require('./actions/randomString')
const Shit = require('./actions/shit')
const errors = require('./errors')

module.exports = class Router {
  
  constructor() {
    this.randomString = new RandomString()
    this.shit = new Shit()
  }
  
  parseRequest(str) {
    let data = false
    try {
      data = JSON.parse(str)
    } catch(e) {
      return false
    }
    return data
  }
  
  go(req, ws, msg) {
    let data = this.parseRequest(msg) // Вдруг прилетел неправильный json
    if( data ) {
      switch( data.get ) { 
      case 'randomString': // Смотрим, есть ли у нас экшен
        this.randomString.response(ws, data)
        break
      
      case 'shit': // Смотрим, есть ли у нас экшен
        this.shit.response(ws, data)
        break
      
      default: // Либо отдаём 404
        ws.send( JSON.stringify(errors['404']) )
        break
      }
    } else 
      ws.send( JSON.stringify(errors['400']) )    
  }
  
}

Запускаем наш сервер и проверяем, сперва нормальный реквест:

Websocket request

Теперь отправляем наше недоразумение:

Error request

И смотрим в консольлог:

Console log

Сервер благополучно упал. Пока им пользуемся только мы, ничего страшного, можно и перезапустить вручную. Но вот если проектом пользуются пару тысяч человек, а ещё и мы ушли на выходные/праздники/в запой... Нам нужно как-то автоматически перезапускать сервер, если он упал. Для этого существуют сервис-менеджеры.

Устанавливаем pm2

sudo npm install pm2 -g

Теперь наш проект нужно запускать командой:

pm2 start index.js

Лог:

pm2 запуск

Отправим ошибочный запрос и посмотрим что нам скажет: pm2 status

pm2 перезапуск

Сервер автоматически перезапустился. Вот теперь всё, теперь если сервер упадёт, pm2 его автоматически перезапустит. Напоследок нужно подправить наш package.json:

{
  "name": "api-express",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "mocha --reporter spec --bail --check-leaks test/",
    "lint": "eslint ./js/*",
    "start": "pm2 start index.js",
    "stop": "pm2 stop index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "*",
    "express-ws": "*",
    "eslint": "*",
    "mocha": "*"
  }
}

Теперь наш проект будет стартовать командой:

npm start

И выключаться:

npm stop

Обновлённые проект



Комментарии

Оставить комментарий:

Ваш e-mail не будет опубликован. Обязательные поля помечены *