Ejercicio integrador de todos los conceptos vistos de ExpressJS
- Utilizar
express-generator
para generar el scaffolding del proyecto
npx express-generator --git express-salad
- Crear una aplicación con
Express
, que tenga al archivoapp.js
como entrypoint y escuche en el puerto9001
(leerlo del archivo.env
). En el caso de que no haya un puerto seteado en.env
, la aplicación debe escuchar en el puerto8001
. Cuando el servidor esté levantado, loguear el mensajeServer listening on http://${HOSTNAME}:${PORT}
, dondeHOSTNAME
es otra variable de entorno con el valorlocalhost
. - Todos los assets (archivos estáticos) estarán ubicados dentro de
/public
(y sus subdirectorios). Se debe utilizar el middlewareexpress.static(PATH)
para servirlos. - Las imágenes deben estar ubicadas en la carpeta
/public/images
. - Probar los endpoints con Postman.
- Utilizar el middleware
body-parser
para parsear los requests que envíenJSON
app.js
debe contar con las rutas definidas a continuación (la lógica de routing debe estar separada, utilizando elRouter
de Express), definidas en/routes/index.js
e importadas y utilizadas desdeapp.js
.- Utilizar el método
route()
delRouter
, para definir las rutas de una forma más declarativa. - En caso de necesitar debuggear la aplicación, utilizar esta guía.
GET /
: debe retornar unJSON
listando todos los endpoints disponibles, agrupados por tipo de verbo HTTPGET /over/:ki
: si el parámetro recibido es mayor a 9000, debemos retornar esta imagen. Si el parámetro está recibido entre 8000 y 9000, debe responder con esta imagenGET /download
: debe retornar el mensaje (string)No te entiendo.
GET /download/internet
: debe generar una descarga de esta imagen, con el nombredownload-all-the-internet.jpg
. Investigar qué método deExpress
provee esta funcionalidad.GET /area51
: responder con elJSON
{ message: "RESTRICTED AREA. NO TRESPASSING." }
y status code401
POST /area51
: enviar elJSON
{ "secret": {SECRET_VALUE}}
. SiSECRET_VALUE
esaliens
, responder con elJSON
{ message: "ACCESS GRANTED." }
y status code200
, sino responder con elJSON
{ message: "RESTRICTED AREA. NO TRESPASSING." }
y status code401
GET /undefined
: responder con"404 - Ni idea, no lo encuentro"
y status code404
GET /shout/:word
: responder con elJSON
Quisiste decir {WORD}???
dondeWORD
es el parámetro recibido, convertido a mayúsculasPOST /users
: recibe un request con unJSON
de la forma{ name: {NAME}, email: {EMAIL}, age: {AGE} }
. Usarexpress-validator
para validar quename
tiene al menos 3 letras (y sólo contiene letras),email
es un mail válido yage
es un entero entre 0 y 120. Si pasa la validación y no existe otro usuario con ese email, agregarlo al arrayregisteredUsers
con la propiedadid
, que es un entero mayor que cero que no se repite y corresponde al orden en que se creó el usuario (el primer usuario tendráid=1
, el segundoid=2
, etc), dentro del módulousers.js
. Si algún campo no pasa la validación, responder con un status 422 y retornar los errores en formatoJSON
. Usar además, las funcionalidades que nos proveeexpress-validator
para sanitizar el input, de forma tal quename
no contenga espacios al inicio ni al final ni otros caracteres especiales,email
esté normalizado yage
no contenga espacios al inicio ni al final ni otros caracteres especiales.GET /users
: retorna un HTML generado conpug
, el cual contiene una tabla con las columnasNombre
,Email
yEdad
, generada a partir del contenido del arrayregisteredUsers
.- Agregar un middleware custom para manejar los errores y responder, en formato
JSON
con el formato
{
message: err.message,
/*
if we're in development mode, include stack trace (full error object)
otherwise, it's an empty object so the user doesn't see all of that
*/
error: app.get("env") === "development" ? err : {}
}
PUT /users/:id
permite editar los camposname
,email
oage
del usuario con elid
correspondiente (elid
no puede editarse). Si elid
utilizado como parámetro no corresponde con ningún usuario, generar el mismo error anterior.DELETE /users/:id
permite eliminar el usuario deusers
, con elid
correspondiente. Si elid
utilizado como parámetro no corresponde con ningún usuario, generar el mismo error anterior.GET /html/:name/:color
:name
ycolor
son parámetros que representan un nombre y un color, respectivamente.- Responder con el siguiente HTML, en un archivo
index.html
, generado conPug
. Si el color recibido esred
óblue
, el html debe tener unbackground-color: red
óbackground-color: blue
, respectivamente. Este CSS debe estar definido en un archivostyles.css
. Tanto elindex.html
como elstyles.css
deberán ser servidos estáticamente desde la carpeta/public
.
- Responder con el siguiente HTML, en un archivo
GET /google
: redirigir ahttps://google.com
, con un status code301
.POST /series
: elbody
del request será el siguienteJSON
.- Retornar un
JSON
con la siguiente info, procesada y extraída a partir del request:
- Retornar un
{
"series name": {nombre de la serie},
"number of episodes": {cantidad total de episodios},
"total runtime": {cantidad total de minutos que dura la serie},
"first episode": {
"name": {nombre},
"date": {fecha de estreno}
},
"last episode": {
"name": {nombre},
"date": {fecha de estreno}
},
}