This repository was archived by the owner on Jan 24, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
159 lines (135 loc) · 4.6 KB
/
Copy pathindex.js
File metadata and controls
159 lines (135 loc) · 4.6 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// Carga las variables del ".env" globalmente. Debe ir antes de cualquier importación que las use (ej: "./models/persona").
require('dotenv').config()
const express = require('express')
//Importamos el módulo morgan para el registro de solicitudes HTTP.
const morgan = require('morgan')
const cors = require('cors')
const Persona = require('./models/persona')
const app = express()
// Función centralizada para manejar errores de Express.
const controladorDeErrores = (error, request, response, next) => {
console.error(error.message)
// "CastError" ocurre cuando el ID proporcionado tiene un formato incorrecto para MongoDB.
if (error.name === 'CastError') {
return response.status(400).send({ error: 'ID con formato incorrecto' })
} else if (error.name === 'ValidationError') {
return response.status(400).json({ error: error.message })
}
next(error)
}
// Middleware para servir el frontend estático.
app.use(express.static('dist'))
app.use(express.json())
// Se habilita CORS para todas las solicitudes.
app.use(cors())
// Se define un token personalizado para mostrar el body.
morgan.token('body', (req) => JSON.stringify(req.body))
// Formato tiny + mostrar body solo en caso de POST.
app.use(
morgan((tokens, req, res) => {
const log = [
tokens.method(req, res),
tokens.url(req, res),
tokens.status(req, res),
tokens.res(req, res, 'content-length'),
'-',
tokens['response-time'](req, res),
'ms',
].join(' ')
// Si es un POST, agregamos el body.
return req.method === 'POST' ? `${log} ${tokens.body(req, res)}` : log
})
)
// Ruta para obtener todos los contactos de la agenda telefónica.
app.get('/api/persons', (request, response) => {
Persona.find({}).then((personas) => {
response.json(personas)
})
})
// Ruta que proporciona info.
app.get('/info', (request, response, next) => {
// Se cuenta todos los registros de la colección.
Persona.countDocuments({})
.then((cantidad) => {
// Fecha y hora actual.
const fecha = new Date()
response.send(`
<p>La agenda telefónica tiene información de ${cantidad} personas</p>
<p>${fecha}</p>
`)
})
.catch((error) => next(error))
})
// Ruta que devuelve los datos de una persona segun su id.
app.get('/api/persons/:id', (request, response, next) => {
Persona.findById(request.params.id)
.then((persona) => {
if (persona) {
response.json(persona)
} else {
response.status(404).end()
}
})
.catch((error) => next(error))
})
// Ruta para eliminar una persona segun su id.
app.delete('/api/persons/:id', (request, response, next) => {
Persona.findByIdAndDelete(request.params.id)
.then(() => {
response.status(204).end()
})
.catch((error) => next(error))
})
// Ruta para agregar nuevas personas a la agenda telefónica.
app.post('/api/persons', (request, response, next) => {
const nuevaPersona = request.body
// Si falta el nombre o el número...
if (!nuevaPersona.name || !nuevaPersona.number) {
return response.status(400).json({
error: 'Falta el nombre o el número',
})
}
// Se crea la instancia de Mongoose (el ID se generará automáticamente).
const persona = new Persona({
name: nuevaPersona.name,
number: nuevaPersona.number,
})
// Se guarda en la bd.
persona
.save()
.then((personaGuardada) => {
response.status(201).json(personaGuardada)
})
.catch((error) => next(error))
})
// Ruta para actualizar una persona existente mediante su id.
app.put('/api/persons/:id', (request, response, next) => {
const { name, number } = request.body
// Se busca el ID en la bd.
Persona.findById(request.params.id)
.then((persona) => {
if (!persona) {
return response.status(404).end()
}
// Se editan los campos del documento Mongoose.
persona.name = name
persona.number = number
// Por ultimo, se guarda el documento actualizado.
return persona.save().then((personaActualizada) => {
response.json(personaActualizada)
})
})
.catch((error) => next(error))
})
// Middleware para manejar rutas no encontradas.
const rutaDesconocida = (request, response) => {
response.status(404).send({ error: 'Ruta no encontrada' })
}
app.use(rutaDesconocida)
// Uso del middleware de manejo de errores, siempre debe estar al final.
app.use(controladorDeErrores)
// Render asigna el puerto a través de una variable de entorno, por lo tanto usará process.env.PORT.
const PORT = process.env.PORT || 10000
app.listen(PORT, () => {
console.log(`Servidor escuchando en: http://localhost:${PORT}`)
})