1+ import path from 'node:path'
2+ import express from 'express'
3+ import createError from 'http-errors'
4+ import logger from 'morgan'
5+ import connectMongoose from './lib/connectMongoose.js'
6+ import * as homeController from './controllers/homeController.js'
7+ import * as loginController from './controllers/loginController.js'
8+ import * as agentsController from './controllers/agentsController.js'
9+ import * as sessionManager from './lib/sessionManager.js'
10+ import upload from './lib/uploadConfigure.js'
11+ import i18n from './lib/i18nConfigure.js'
12+
13+ await connectMongoose ( ) // top level await thanks to ES modules
14+ console . log ( 'Connected to MongoDB.' )
15+
16+ const app = express ( )
17+
18+ app . set ( 'views' , 'views' ) // views folder
19+ app . set ( 'view engine' , 'html' )
20+ app . engine ( 'html' , ( await import ( 'ejs' ) ) . __express )
21+
22+ app . locals . appName = 'NodeApp'
23+
24+ app . use ( logger ( 'dev' ) )
25+ app . use ( express . urlencoded ( { extended : false } ) )
26+ app . use ( express . static ( path . join ( import . meta. dirname , 'public' ) ) )
27+
28+ /**
29+ * Application routes
30+ */
31+ app . use ( sessionManager . middleware )
32+ app . use ( sessionManager . useSessionInViews )
33+ app . use ( i18n . init )
34+ app . get ( '/' , homeController . index )
35+ app . get ( '/login' , loginController . index )
36+ app . post ( '/login' , loginController . postLogin )
37+ app . get ( '/logout' , loginController . logout )
38+ app . get ( '/agents/new' , sessionManager . guard , agentsController . index )
39+ app . post ( '/agents/new' , sessionManager . guard , upload . single ( 'avatar' ) , agentsController . postNew )
40+ app . get ( '/agents/delete/:agentId' , sessionManager . guard , agentsController . deleteAgent )
41+
42+ // Ejemplos
43+ app . get ( '/param_in_route/:num?' , homeController . paranInRoute )
44+ app . get ( '/param_in_route_multiple/:product/size/:size([0-9]+)/color/:color' , homeController . paranInRouteMultiple )
45+ app . get ( '/param_in_query' , homeController . validateParamInQuery , homeController . paramInQuery )
46+ app . post ( '/post_with_body' , homeController . postWithBody )
47+
48+ // catch 404 and send error
49+ app . use ( ( req , res , next ) => {
50+ next ( createError ( 404 ) )
51+ } )
52+
53+ // error handler
54+ app . use ( ( err , req , res , next ) => {
55+
56+ // manage validation errors
57+ if ( err . array ) {
58+ err . message = 'Invalid request: ' + err . array ( )
59+ . map ( e => `${ e . location } ${ e . type } "${ e . path } " ${ e . msg } ` )
60+ . join ( ', ' )
61+ err . status = 422
62+ }
63+
64+ res . status ( err . status || 500 )
65+
66+ // set locals, including error information in development
67+ res . locals . message = err . message
68+ res . locals . error = process . env . NODEAPP_ENV === 'development' ? err : { }
69+
70+ res . render ( 'error' )
71+ } )
72+
73+ export default app
0 commit comments