-
Notifications
You must be signed in to change notification settings - Fork 6
/
app.js
109 lines (81 loc) · 3.57 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
103
104
105
106
107
108
109
// importar módulos de terceros
const express = require('express');
const morgan = require('morgan');
const mongoose = require('mongoose');
const session = require('express-session');
const flash = require('connect-flash');
const cors = require('cors');
const dotenv = require('dotenv');
dotenv.config();
// importar las rutas públicas
const indexRoutes = require('./routes/index.js');
// importar las rutas de administrador
const adminRoutes = require('./routes/admin.js');
// rutas de autentificación
const authRoutes = require('./routes/auth.js');
// rutas de la REST API
const apiRoutes = require('./routes/api.js');
// creamos una instancia del servidor Express
const app = express();
// Tenemos que usar un nuevo middleware para indicar a Express que queremos procesar peticiones de tipo POST
app.use(express.urlencoded({ extended: true }));
// Configurar sesión
app.use(session({
secret: 'miSecretoSuperSecreto',
resave: false,
saveUninitialized: true,
cookie: { secure: false } // secure: true en producción con HTTPS
}));
app.use(flash());
app.use((req, res, next) => {
// La variable req.locals es una variable "global" de tipo objecto a la que todas las vistas pueden acceder
// Si el usuario esta autentificado entonces es que es de tipo administrador
res.locals.isAdmin = req.session.isAuthenticated;
res.locals.success_msg = req.flash('success_msg');
// tenemos que ejecutar next() para que la petición HTTP siga su curso
next();
})
// Añadimos el middleware necesario para que el client puedo hacer peticiones GET a los recursos públicos de la carpeta 'public'
app.use(express.static('public'));
const PORT = process.env.PORT || 3000;
// Especificar a Express que quiero usar EJS como motor de plantillas
app.set('view engine', 'ejs');
// Usamos el middleware morgan para loguear las peticiones del cliente
app.use(morgan('tiny'));
// Añadimos las ritas de index.js en nuestra app
// El primer parámetro significa que todas las rutas que se encuentren en 'indexRouter' estarán prefijados por '/'
// Voy a prefijar todas las rutas de administrador con '/admin'
// Middleware para proteger las rutas de administrador
app.use('/admin', (req, res, next) => {
// Miramos si el usuario esta autentificado
if (req.session.isAuthenticated) {
// Si es que si, establecemos que es de tipo administrador y permitimos que siga la petición
res.locals.isAdmin = true;
next(); // /admin/apartments/new-apartment
} else {
// en caso contrario lo llevamos a la vista de login
res.redirect('/login');
}
});
// Esto lo explicaremos el 1/10
app.use(cors());
app.use('/admin', adminRoutes);
app.use('/', authRoutes);
app.use('/', indexRoutes);
app.use('/api', apiRoutes);
async function connectDB() {
await mongoose.connect(process.env.MONGODB_URI);
console.log('Conectado a la base de datos');
}
connectDB().catch(err => console.log(err))
/** Uso de middleware para gestionar cualquier error imprevisto de nuestra aplicaicón y fallar de forma grácil */
app.use((err, req, res, next) => {
// err.message -> simplemente el mensaje
// err.stack -> la pila de llamadas
console.error(err)
// Enviar un correo electronico o cualquier otro medio a los desarrolladores para que se den cuenta de que algo ha 'petao'
res.status(500).send('<p>Ups! La operación ha fallado. Hemos informado a los desarrolladores. Vuelve a probarlo más tarde.Vuelve a la <a href="/">home page</a></p> ');
})
app.listen(PORT, (req, res) => {
console.log("Servidor escuchando correctamente en el puerto " + PORT);
});