хуйу нас не матерятся
Сейчас у нас есть практически готовый проект. Мы принимаем запросы, отправляем ответы, есть немного тестов и вроде всё ок. Но в продакшен нам ещё рано. Давайте создадим гипотетическую ситуацию, например, у нас есть в коде ошибка, приводящая к падению проекта, о которой мы типа не знаем.
Создадим новый экшен 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']) )
}
}
Запускаем наш сервер и проверяем, сперва нормальный реквест:
Теперь отправляем наше недоразумение:
И смотрим в консольлог:
Сервер благополучно упал. Пока им пользуемся только мы, ничего страшного, можно и перезапустить вручную. Но вот если проектом пользуются пару тысяч человек, а ещё и мы ушли на выходные/праздники/в запой... Нам нужно как-то автоматически перезапускать сервер, если он упал. Для этого существуют сервис-менеджеры.
Устанавливаем pm2
sudo npm install pm2 -g
Теперь наш проект нужно запускать командой:
pm2 start index.js
Лог:
Отправим ошибочный запрос и посмотрим что нам скажет: pm2 status
Сервер автоматически перезапустился. Вот теперь всё, теперь если сервер упадёт, 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