-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
102 lines (86 loc) · 2.88 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
require('dotenv').config();
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const { celebrate, Joi, errors } = require('celebrate');
// Безопасность
const helmet = require('helmet');
const cors = require('cors');
const mongoose = require('mongoose');
const limiter = require('./middlewares/rateLimiter');
const app = express();
const { PORT = 3005 } = process.env;
const { DB_ADDRESS } = require('./config');
const auth = require('./middlewares/auth');
const { login, createUser } = require('./controllers/users');
// Ошибки
const { requestLogger, errorLogger } = require('./middlewares/logger');
const NotFoundError = require('./errors/NotFoundError'); // 404
const handleErrors = require('./middlewares/handleErrors'); // 500
// Безопасность
app.use(
cors({
origin: [
'http://localhost:3000', // фронтенд локальный
'http://localhost:3005',
'https://api.milenadiploma.nomoredomainswork.ru', // фронтенд сервер
'https://milenadiploma.nomoredomainswork.ru', // фронтенд сервер
'https://api.nomoreparties.co/beatfilm-movies',
],
credentials: true,
maxAge: 30,
}),
);
app.use(helmet());
app.use(cookieParser());
app.use(limiter);
// Подключаемся к серверу Mongo
mongoose.connect(DB_ADDRESS);
// Сборка пакетов
app.use(bodyParser.json()); // для собирания JSON-формата
app.use(bodyParser.urlencoded({ extended: true })); // для приёма веб-страниц внутри POST-запроса
// подключаем логгер запросов
app.use(requestLogger);
// Проверка падения и восстановления сервера
app.get('/crash-test', () => {
setTimeout(() => {
throw new Error('Сервер сейчас упадёт');
}, 0);
});
// Регистрация
app.post(
'/signup',
celebrate({
body: Joi.object().keys({
name: Joi.string().required().min(2).max(30),
email: Joi.string().email().required(),
password: Joi.string().required(),
}),
}),
createUser,
);
// Аутентификация
app.post(
'/signin',
celebrate({
body: Joi.object().keys({
email: Joi.string().email().required(),
password: Joi.string().required(),
}),
}),
login,
);
// Маршруты
app.use('/', auth, require('./routes/users'));
app.use('/', auth, require('./routes/movies'));
// Роут неизвестного маршрута
app.all('*', (req, res, next) => {
next(new NotFoundError('Страница не найдена'));
});
// подключаем логгер ошибок
app.use(errorLogger);
// Обработчик ошибок celebrate
app.use(errors());
// Централизованная обработка ошибок
app.use(handleErrors);
app.listen(PORT);