21.3. MVC - Model, View, Controller Pattern

Look at https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller to get an overview of what MVC is.

Figure 21.1. The Logics of the MVC Architecture Pattern in an Express Context

Example 21.1. The App Reviewed. nodemyg/myg91/app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');                // activate Router/Controller
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);                                  // path to Router/Controller
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

Example 21.2. The Router Reviewed. nodemyg/myg91/routers/index.js
const worldControllers = require("../controllers/worldControllers");
const express = require('express');
const router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {                  // route
    res.render('index', { title: 'Express' });              // direct response with view
});

router.get("/items/:vegetable", function(req, res, next) {  // route
    let veg = req.params.vegetable;                         // handling before
    res.send(`This is the page for ${veg}`);                // response
});

router.get('/contact', function(req, res, next) {           // route
    res.render('contact', { title: 'Express Contacts' });   // direct response with view
});
router.post("/contact", function(req, res, next) {          // route
    console.log(req.body);                                  // handling before
    res.send("This page will be handling contacts");        // response
});

/*
 *  A couple of extra routes as hints, not used in myg91
 */
router.get("/country/:country", function(req, res, next) {  // route with country name
    let country = worldControllers.retrieveCountry(req.params.country);  // get data from
    res.render("country", country);
});
router.get("/countryData", function(req, res, next) {       // route to  country form page
    res.render("countryData", {});
});
router.post("/countryData", function(req, res, next) {      // route with country data
    worldControllers.insertCountry(req, res);               // handling before
});

module.exports = router;