0

I have the following folder structure:

  • bin
  • controllers
  • models
  • node_modules
  • public
  • routes
  • views
  • app.js
  • package.json
  • As I am new to node.js and express.js, I would like to know how to render .ejs file from the controller file. Currently, my code looks like:

    //controllers/login.js

    module.exports = {
        getLoginPage: function (req, res) {
            res.render('login-form');
        }
    };
    

    //routes/login.js

    var login = require('../controllers/login');
    module.exports = function(app){    
        app.get('/', login.getLoginPage);
    };
    

    //app.js

    var express = require('express');
    var http = require('http');
    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser'); //parses information from POST
    var stylus = require('stylus');
    var validator = require('express-validator');
    var session = require('express-session');
    
    var app = express();
    
    require('./routes/login')(app);
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');
    
    // uncomment after placing your favicon in /public
    //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(validator());
    app.use(cookieParser());
    app.use(stylus.middleware(path.join(__dirname, 'public')));
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(session({secret: 'max', saveUninitialized: false, resave: false}));
    
    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });
    
    // 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;
    

    In my controller, if I write res.send("Hello");, it prints but I want the entire .ejs file to show up on my browser. How is this possible?

    Also, if I render the .ejs from my routes, it's displaying properly but not from the controllers.

    //error

    Error: Failed to lookup view "error" in views directory "C:\node\folder-name\views"
        at EventEmitter.render (C:\node\folder-name\node_modules\express\lib\application.js:580:17)
        at ServerResponse.render (C:\node\folder-name\node_modules\express\lib\response.js:971:7)
        at C:\node\folder-name\app.js:60:7
        at Layer.handle_error (C:\node\folder-name\node_modules\express\lib\router\layer.js:71:5)
        at trim_prefix (C:\node\folder-name\node_modules\express\lib\router\index.js:315:13)
        at C:\node\folder-name\node_modules\express\lib\router\index.js:284:7
        at Function.process_params (C:\node\folder-name\node_modules\express\lib\router\index.js:335:12)
        at next (C:\node\folder-name\node_modules\express\lib\router\index.js:275:10)
        at Layer.handle_error (C:\node\folder-name\node_modules\express\lib\router\layer.js:67:12)
        at trim_prefix (C:\node\folder-name\node_modules\express\lib\router\index.js:315:13)
    

    Thanks

    1
    • @DevAymen The solution doesnt work for me. Commented Sep 20, 2017 at 11:54

    4 Answers 4

    2

    Change your view path to this:-

    app.set('views',path.join(__dirname+'/views/'));
    

    then in controller you can simply use

    //assuming hello.ejs is in your view folder
    response.render('hello.ejs');
    

    and if you have folders in views folder then use

    response.render('error/404.ejs');
    
    Sign up to request clarification or add additional context in comments.

    Comments

    0

    First, you need to set the rendering engine for views:

    app.set('view engine','ejs');
    

    Comments

    0

    You need to set the view engine to ejs :

    app.set('view engine', 'ejs')
    

    Docs

    5 Comments

    can you show more code and info, like is the view directly in the views folder or in a sub folder. what is the error message ?
    please check the updated question. and yes, .ejs files are under views folder.
    from what i see. the app reaches the error handler you set in the app.js and when it reached res.render('error') it couldn't find the error view. which is weird cause the app.use is after the route handler and logically the middleware was not supposed to be reached as you are not calling next() in your routes.... try removing both the 404 forward to error handler and the error handler, and see if the view is rendered
    after removing those codes, its giving me this error: "TypeError: Cannot read property 'errors' of undefined".
    Where is that error occuring. i assume the error message is pointing to the line of the error ?
    0

    Try the following:

    var path = require('path');
    res.render(path.resolve('./views/error'))
    

    Comments

    Your Answer

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