Skip to content

Instantly share code, notes, and snippets.

@Kernix13
Created March 31, 2024 15:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kernix13/3a01ec43cf9ce43602640b67e6aeb1ad to your computer and use it in GitHub Desktop.
Save Kernix13/3a01ec43cf9ce43602640b67e6aeb1ad to your computer and use it in GitHub Desktop.
Full-stack EJS, Node & Express app.js example
if (process.env.NODE_ENV !== 'production') {
require('dotenv').config();
}
const express = require('express');
const path = require('path');
const mongoose = require('mongoose');
const ejsMate = require('ejs-mate');
const methodOverride = require('method-override');
const flash = require('connect-flash');
const User = require('./models/user');
const passport = require('passport');
const localStrategy = require('passport-local');
const session = require('express-session');
const mongoSanitize = require('express-mongo-sanitize');
const helmet = require('helmet');
const sessionConfig = require('./utils/sessionConfig');
const csp = require('./utils/contentSecurityPolicy');
const ExpressError = require('./utils/ExpressError')
const retreatsRoutes = require('./routes/retreats');
const reviewsRoutes = require('./routes/reviews.js');
const userRoutes = require('./routes/users');
/* Below is for production */
const dbUrl = process.env.DB_URL;
/* Below is for development */
// const dbUrl = 'mongodb://127.0.0.1:27017/yelp-retreat';
mongoose.connect(dbUrl);
// mongoose.connect('mongodb://127.0.0.1:27017/yelp-retreat');
const db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", () => {
console.log("Database connected");
});
const app = express();
/* Set EJS as the view engine */
app.engine('ejs', ejsMate);
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
// Forms
app.use(express.urlencoded({ extended: true }));
app.use(methodOverride('_method'));
// public folder assets
app.use(express.static(path.join(__dirname, 'public')));
// Flash messages to the user
app.use(flash());
// Sanitize user-supplied data
app.use(mongoSanitize());
// Session and store
app.use(session(sessionConfig));
app.use(helmet());
app.use(helmet.contentSecurityPolicy(csp));
// Auth
app.use(passport.initialize());
app.use(passport.session());
passport.use(new localStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
// res local variables scoped to the req
app.use((req, res, next) => {
res.locals.currentUser = req.user;
res.locals.success = req.flash('success');
res.locals.error = req.flash('error');
next();
})
app.use('/retreats', retreatsRoutes);
app.use('/retreats/:id/reviews', reviewsRoutes);
app.use('/', userRoutes);
// Home route
app.get('/', (req, res) => {
res.render('home')
})
// 404 error
app.all('*', (req, res, next) => {
next(new ExpressError('Page Not Found', 404));
})
// Server error
app.use((err, req, res, next) => {
const { statusCode = 500 } = err;
if (!err.message) err.message = 'Error: Something went wrong.'
res.status(statusCode).render('error', { err });
})
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`LISTENING ON PORT ${port}`);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment