// Import 3rd party node modules. const express = require('express') const path = require('path') const logger = require('morgan') const helmet = require('helmet') const favicon = require('serve-favicon') const cookieParser = require('cookie-parser') const createError = require('http-errors') const debug = require('debug')('termPortal:app') // Import own modules. const { isBehindProxy, secret } = require('./config/keys') const helmetConfig = require('./config/helmet') const session = require('./middleware/session') const passport = require('./middleware/auth') const user = require('./middleware/user') const settings = require('./middleware/settings') const { enhanceLocals } = require('./middleware') // Import Routers. const apiRouter = require('./routes/api') const adminRouter = require('./routes/admin') const dictionariesRouter = require('./routes/dictionaries') const extractionRouter = require('./routes/extraction') const consultancyRouter = require('./routes/consultancy') const indexRouter = require('./routes/index') // Create express app. const app = express() // View engine setup. const viewsPath = path.join(__dirname, 'views') app.set('view engine', 'pug') app.set('views', viewsPath) app.locals.basedir = viewsPath // Other settings. const inDevEnv = app.get('env') === 'development' if (isBehindProxy) app.set('trust proxy', 1) // Trust first proxy. // Mount middleware. app.use(logger('dev')) app.use(helmet(helmetConfig)) app.use(favicon(path.join(__dirname, 'public', 'images', 'favicon.ico'))) app.use(express.static(path.join(__dirname, 'public'))) app.use(express.json({ type: ['application/json', 'application/csp-report'] })) app.use(express.urlencoded({ extended: true })) app.use(cookieParser(secret)) app.use(session) app.use(passport.initialize()) app.use(passport.session()) app.use(passport.authenticate('remember-me')) app.use(user.enhance) app.use(settings.prepareRequiredSettings) app.use(enhanceLocals) // Apparently express-debug can't be run inside another middleware and must be run in this file. // To help you debug, temporarily uncomment the next line, but comment the helmet line due to strict CSP. // if (app.get('env') === 'development') require('express-debug')(app) // Pretty printing pug output is strongly ill-advised and deprecated, since too often, it creates subtle bugs. // But if you really need it to help you debug, you can temporarily enable the next line. // app.locals.pretty = true // Mount routers. app.use('/api', apiRouter) app.use('/admin', adminRouter) app.use('/slovarji', dictionariesRouter) app.use('/luscenje', extractionRouter) app.use('/svetovanje', consultancyRouter) app.use('/', indexRouter) // Catch 404 and forward to error handler. app.use((req, res, next) => next(createError(404))) // Error handler. app.use((err, req, res, next) => { if (err.status !== 404) debug(err) // Set error info to be displayed to user depending on environment. let message, error if (inDevEnv || err.displayInProd) { message = err.message error = err } else { message = err.status === 404 ? 'Stran ne obstaja' : 'Prišlo je do strežniške napake. Poskusite kasneje.' error = {} } res.status(err.status || 500) // Send plain error message for ajax requests. if (req.isAjax) { return res.send(message) } // Render the error page. res.render('error', { title: 'Napaka', message, error }) }) module.exports = app