1

I'm trying to learn expressjs, and have been trying to figure out a way to add MVC structure into it. For some reason, I get a 404 error when i try to access localhost:3000.

My directory structure is:

  • App
    • app.js
    • routes.js
    • controllers
    • views
    • etc.

App.js:

mymodule = {

/* initialize 
 * ==============================
 * load dependencies & external node modules, setup engines */ 
initialize: function() {

    // load modules
    this.express = require('express');
    this.path = require('path');
    this.favicon = require('static-favicon');
    this.logger = require('morgan');
    this.cookieParser = require('cookie-parser');
    this.bodyParser = require('body-parser');

    // initialize main express app.
    this.app = this.express();

    // attach view engine to app
    this.app.set('views', this.path.join(__dirname, 'views')); // view files are in /views/
    this.app.set('view engine', 'jade');

    // attach modules to app
    this.app.use(this.favicon());
    this.app.use(this.logger('dev'));
    this.app.use(this.bodyParser.json());
    this.app.use(this.bodyParser.urlencoded());
    this.app.use(this.cookieParser());
    this.app.use(this.express.static(this.path.join(__dirname, 'public'))); // static files are in /public/
},

/* setErrorHandlers
 * ===============================
 * set error handlers for routing */
setErrorHandlers: function() {
    if (this.app == undefined) {    
        console.log("caught an attempt to set error handlers without initializing");
    } else {

        // Catch 404 Error and forward to error handler 
        this.app.use(function(req, res, next) {
            console.log("Caught 404 Error");
            var err = new Error('Not Found');
            err.status = 404;
            next(err);
        });

        // Error Handlers

        // 1) Dev Error Handler. print stack trace
        if (this.app.get('env') === 'development') {
            this.app.use(function(err, req, res, next) {
                res.status(err.status || 500);
                res.render('error', {
                    message: err.message,
                    error: err
                });
            });
        }

        // 2) Production Error Handler

        this.app.use(function(err, req,res, next) {
            res.status(err.status || 500);
            res.render('error', {
                message: err.message,
                error: {}
            });
        });
    }
},

/* setRouters
 * ================================
 * */
setRouters: function() {
    // get all routes 
    this.routes = require('./routes').construct(this.app);

}
}

mymodule.initialize();
mymodule.setErrorHandlers();
mymodule.setRouters();

module.exports = mymodule.app;'

routes.js:

var index_controller = require('./controllers/index').controller();

module.exports.construct = function(app) {
    console.log("got here");
    //app.get('/', require('./controllers/index').about);
    //app.get('/', index_controller.index);
    app.get('/', function(req,res) {res.send("sdf");});
}

./controllers/index.js:

module.exports.controller = function() {
index_action = function(req, res) {
    if (req == undefined) {
        console.log("req undefined!");
    } else {
    console.log(req);
    res.render('index', {title: 'Express'});
    }
}

return {index: index_action};

}

I put the code on github repo: https://github.com/sjang92/expressjs-mvc/blob/master/controllers/index.js

Does anyone know why it's happening?

Thank you

1 Answer 1

2

You're adding a normal middleware function that responds to the request before your app.get('/', ..); handler has a chance to execute:

    this.app.use(function(req, res, next) {
        console.log("Caught 404 Error");
        var err = new Error('Not Found');
        err.status = 404;
        next(err);
    });

You should instead only add this kind of middleware after all of your other routes. For example:

mymodule.initialize();
mymodule.setRouters();
mymodule.setErrorHandlers();
Sign up to request clarification or add additional context in comments.

1 Comment

Ohhh that makes sense! Thank you so much I'll accept your answer in 5 min

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.