jansmolders86
jansmolders86

Reputation: 5759

Subfolder views expressjs 3x /nodejs

How can I use a subfolder for my 'views'? In the main 'app.js' I've set the root folder for the views like so:

 app.configure(function(){
       app.set('view engine', 'jade');
       app.set('views', __dirname + '/apps' );
       app.use(express.bodyParser());
       app.use(express.methodOverride());
       app.use(express.static(__dirname + '/apps' ));
       app.use(app.router);
 });

And my controller loos like this:

 module.exports = function(req, res, base) {
       res.render( 'hello/views/');
 };

The folder looks like this:

 ./apps/hello/views/index.js

But still it can't find it. "ERROR: Failed to lookup view "hello/views" Thanks!

Upvotes: 0

Views: 4327

Answers (4)

AfDev
AfDev

Reputation: 1242

You can set views as array of paths

app.set('views', [path.join(__dirname, 'views/users/'), path.join(__dirname, 'views')])

You can check the resulting paths using app.get('views'); which should return an array.

[/server/views/users/, /server/views]

Express will search through the array for available paths. You can then render with just the file name like this

res.render( 'index');
res.render( 'profile');

Upvotes: 1

jansmolders86
jansmolders86

Reputation: 5759

Actually, I made a vastly better solution. In the app configuration I just set the default view like so:"

 app.set('view engine', 'jade');
 app.set('views', __dirname + '/views');

Later on I inlcude a boot.js (based on the mvc example of expressjs ) in which I include the following:

 // allow specifying the view engine
 if (obj.engine) app.set('view engine', obj.engine);
 app.set('views', __dirname + '/../apps/' + name + '/views');

This will override the view folder to the one specified in the folder 'apps/xxx/views' and will even allow you to specify a new viewtype in the root of that folder like so:

 // filename = /apps/hello/index.js

 exports.engine = 'jade';

 // Render the indexpage
 exports.index = function(req, res, next){
      res.render('hello');
 };

Upvotes: 3

Plato
Plato

Reputation: 11052

I am surprised that your self answer works, since you should be telling express to render a particular view, and hello/views is a folder. However I'm not familiar with the code pattern you're using for your controller (the base argument is what's throwing me off, since Express middleware uses function(req,res,next).)

My routes look like this:

app.set('views', __dirname + '/apps' );
...
app.get('/hello', function(req,res){
  res.render('hello/views/index')
});

In this case ./apps/hello/views/index.jade is a jade file, not a javascript file. If your templates are javascript, perhaps you should set view engine to something other than jade.

Upvotes: 1

jansmolders86
jansmolders86

Reputation: 5759

I fixed this problem by setting the basis view to the root of the directory like so:

   app.set('views', __dirname);

And the added the folders from the root on in the controller like so:

   res.render( 'apps/hello/views/');

Upvotes: 0

Related Questions