1

I'm trying to modularize my app separating routes, but the only one that works is the root route, I don't know what's the problem with my code, after reading the Express Routing, my code seems to be written correctly

app.js

// ...
var routes = require('./routes/index');
var users = require('./routes/users');
//Require the external route
var about = require('./routes/about');

var app = express();

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

//Routes
app.use('/', routes);
app.use('/users', users);
//The external route 
app.use('login', login);

index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Clazapp' });
});

module.exports = router;

login.js

var express = require('express');
var router = express.Router();

  //login page
  router.get("/login", function(req, res, next) {
    res.render('login');
  });

module.exports = router;

As you can see, the code of both login.js and index.js are pretty the same, however the /login route doesn't work. Appears the message:

Error: Failed to lookup view "error" in views directory "/home/cesar/Documentos/node/clazapp2/views" at EventEmitter.render (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/application.js:579:17) at ServerResponse.render (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/response.js:961:7) at /home/cesar/Documentos/node/clazapp2/app.js:61:7 at Layer.handle_error (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/layer.js:71:5) at trim_prefix (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/index.js:310:13) at /home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/index.js:280:7 at Function.process_params (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/index.js:330:12) at IncomingMessage.next (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/index.js:271:10) at done (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/response.js:956:25) at EventEmitter.render (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/application.js:581:14)

Seems like the file login.jade doesn't found, but he's already located in the directory /views. So complicated, any thoughs?

Cœur
  • 37,241
  • 25
  • 195
  • 267
Cesar Jr Rodriguez
  • 1,691
  • 4
  • 22
  • 35
  • What exact URL are you expecting your login.js route to work for? – jfriend00 Aug 01 '16 at 03:25
  • @jfriend00 I need to get the login.jade, just as simple. – Cesar Jr Rodriguez Aug 01 '16 at 03:35
  • Huhh. I asked what URL are you expecting your login route to work for. Please answer with a full URL. I ask because `app.use('login', login);` seems wrong, but I want to know what URL you are expecting to work before offering advice on what the code for the route should be? – jfriend00 Aug 01 '16 at 03:36

1 Answers1

1

As I know express.Router() must be used only for special case.
I use next way to modularize application

// app.js
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
...
require('./routes')(app); // it's call ./routes/index.js and pass app to it

// ./routes/index.js
var smthEntity = require('./smthEntity');

module.exports = function (app) {
    app.get('/smth-path', ...smth, e.g. checkAuth, ...);
    app.get('/smthEntity', smthEntity.get);

    app.get('/login', require('./login').get);
    app.post('/login', require('./login').post));
}

// ./routes/smthEntity
var SmthEntity = require ('smthEntity'); // include models

exports.get = function(req, res, next) {
    res.render('smthEntity.html', {
        arg1: value1,
        arg2: value2
    }); 
};
... // other method and route for smthEntity

// ./routes/login
exports.get = function(req, res, next) {
    res.render('login.html', { ... });  
};

exports.post = function(req, res, next) {
    ...process post data...
};
Aikon Mogwai
  • 4,954
  • 2
  • 18
  • 31