Error: Failed to lookup view in Express

node.jsExpressPug

node.js Problem Overview


Note: my auto answer at end of the post

I'm trying to make a better experience of nodeJS and i don't really like to get all the script in one file.

so, following a post here i use this structure

./
 config/
   enviroment.js
   routes.js
 public/
   css/
     styles.css
   images
 views
   index
     index.jade
   section
     index.jade
   layout.jade
 app.js

My files are right now:

app.js

var express = require('express');
var app = module.exports = express.createServer();

require('./config/enviroment.js')(app, express);
require('./config/routes.js')(app);

app.listen(3000);

enviroment.js

module.exports = function(app, express) {
	app.configure(function() {
		app.use(express.logger());
		app.use(express.static(__dirname + '/public'));
		app.set('views', __dirname + '/views');
		app.set('view engine', 'jade'); //extension of views

	});

	//development configuration
	app.configure('development', function() {
		app.use(express.errorHandler({
			dumpExceptions: true,
			showStack: true
		}));
	});

	//production configuration
	app.configure('production', function() {
		app.use(express.errorHandler());
	});

};

routes.js

module.exports = function(app) {

	app.get(['/','/index', '/inicio'], function(req, res) {
		res.render('index/index');
	});

	app.get('/test', function(req, res) {
		//res.render('index/index');
	});

};

layout.jade

!!! 5
html
	head
		link(rel='stylesheet', href='/css/style.css')
		title Express + Jade
	body
		#main
			h1 Content goes here
			#container!= body

index/index.jade

h1 algoa

The error i get is:

> Error: Failed to lookup view "index/index" > at Function.render (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\application.js:495:17) > at render (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\response.js:614:9) > at ServerResponse.render (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\response.js:638:5) > at c:\xampp\htdocs\nodejs\buses\config\routes.js:4:7 > at callbacks (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:177:11) > at param (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:151:11) > at pass (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:158:5) > at Router._dispatch (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:185:4) > at Object.router [as handle] (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:45:10) > at next (c:\xampp\htdocs\nodejs\buses\node_modules\express\node_modules\connect\lib\proto.js:191:15)

But i don't really know what is the problem...

I'm starting thinking is because the modules exports...

Answer: Far away the unique solution i found is to change the place i defined app.set('views') and views engine

I moved it to the app.js and now is working well.

var express = require('express');
var app = module.exports = express.createServer();


require('./config/enviroment.js')(app, express);

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

require('./config/routes.js')(app);

app.listen(3000);

I don't really understand the logic behind this but i gonna supose it have one.

node.js Solutions


Solution 1 - node.js

Adding to @mihai's answer:

If you are in Windows, then just concatenating __dirname' + '../public' will result in wrong directory name (For example: c:\dev\app\module../public).

Instead use path, which will work irrespective of the OS:

var path = require ('path');
app.use(express.static(path.join(__dirname + '../public')));

path.join will normalize the path separator character and will return correct path value.

Solution 2 - node.js

npm install [email protected] installs the previous version, if it helps.

I know in 3.x the view layout mechanic was removed, but this might not be your problem. Also replace express.createServer() with express()

Update:

It's your __dirname from environment.js
It should be:

app.use(express.static(__dirname + '../public'));

Solution 3 - node.js

It is solved by adding the following code in app.js file

app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.set('views', __dirname);

app.get('/', function(req, res){
    res.render("index");
});

Solution 4 - node.js

I had the same error at first and i was really annoyed. you just need to have ./ before the path to the template

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

Hope it works, worked for me.

Solution 5 - node.js

You could set the path to a constant like this and set it using express.

const viewsPath = path.join(__dirname, '../views') 
app.set('view engine','hbs')

 app.set('views', viewsPath)

 app.get('/', function(req, res){

 res.render("index");

});

This worked for me

Solution 6 - node.js

Check if you have used a proper view engine. In my case I updated the npm and end up in changing the engine to 'hjs'(I was trying to uninstall jade to use pug). So changing it to jade from hjs in app.js file worked for me.

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

Solution 7 - node.js

In my case, I solved it with the following:

app.set('views', `${__dirname}/views`);
app.use(express.static(`${__dirname}/public`));

I needed to start node app.min.js from /dist folder.

My folder structure was:

Start app from /dist

Solution 8 - node.js

This problem is basically seen because of case sensitive file name. for example if you save file as index.jadge than its mane on route it should be "index" not "Index" in windows this is okay but in linux like server this will create issue.

1) if file name is index.jadge

app.get('/', function(req, res){
      res.render("index");
});

2) if file name is Index.jadge

app.get('/', function(req, res){
      res.render("Index");
});

Solution 9 - node.js

use this code to solve the issue

app.get('/', function(req, res){
    res.render("index");
});

Solution 10 - node.js

Just noticed that I had named my file ' index.html' instead for 'index.html' with a leading space. That was why it could not find it.

Solution 11 - node.js

This error really just has to do with the file Path,thats all you have to check,for me my parent folder was "Layouts" but my actual file was layout.html,my path had layouts on both,once i corrected that error was gone.

Solution 12 - node.js

I change the views folder name to views_render and also facing the same issue as above, so restart server.js and it works for me.

Solution 13 - node.js

I had the same issue and could fix it with the solution from dougwilson: from Apr 5, 2017, Github.

  1. I changed the filename from index.js to index.pug
  2. Then used in the '/' route: res.render('index.pug') - instead of res.render('index')
  3. Set environment variable: DEBUG=express:view Now it works like a charm.

Solution 14 - node.js

I had this issue as well on Linux

I had the following

  res.render('./views/index')

I changed it too
  res.render('../views/index')

Everything is now working.

Solution 15 - node.js

I had the same issue. Then just check the file directory in your explorer. Sometimes views folder isn't present.

Solution 16 - node.js

In my case, I was deploying my web app on a Windows Server and I had a service set up to run a .bat file with only one line as content:

node D:\webapp\app.js

But this was not enough. I also had to change the directory before that, so I added the following line at the beginning of the .bat file:

cd D:\webapp

Solution 17 - node.js

i had the same problem but, i change the name of the file from index.html to index.ejs and works!!!!

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

router.get('/', (req, res) => {
    res.render('index');
});

router.get('/contact', (req, res) => {
  res.render('contact', { title: 'Contact Page' });
});

module.exports = router;

and index.js

const express = require('express');
const morgan = require('morgan');
const path = require('path');
const app = express();



//settings
app.set('port', 4000);
app.set('views', path.join(__dirname,'views'));
app.set('view engine', 'ejs');

//middlewares

//routes
app.use(require('./routes'));

//static files

//listening
app.listen(app.get('port'), () => {
  console.log('Server is running at http://localhost:'+app.get('port')+'/');
});

update: add this in index:

app.engine('html', require('ejs').renderFile);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnaxView Question on Stackoverflow
Solution 1 - node.jsVeeraView Answer on Stackoverflow
Solution 2 - node.jsmihaiView Answer on Stackoverflow
Solution 3 - node.jsCodemakerView Answer on Stackoverflow
Solution 4 - node.jsAhsan Ullah SarbazView Answer on Stackoverflow
Solution 5 - node.jsHarish_MadugulaView Answer on Stackoverflow
Solution 6 - node.jsnilakantha singh deoView Answer on Stackoverflow
Solution 7 - node.jsMaksatView Answer on Stackoverflow
Solution 8 - node.jsuser9160528View Answer on Stackoverflow
Solution 9 - node.jsKARTHIKEYAN.AView Answer on Stackoverflow
Solution 10 - node.jsBobbyView Answer on Stackoverflow
Solution 11 - node.jsHilary MwapeView Answer on Stackoverflow
Solution 12 - node.jsVivek ChaudharyView Answer on Stackoverflow
Solution 13 - node.jsChrisView Answer on Stackoverflow
Solution 14 - node.jsChris BoundsView Answer on Stackoverflow
Solution 15 - node.jsHean Le VillageoisView Answer on Stackoverflow
Solution 16 - node.jsAndrei LucaView Answer on Stackoverflow
Solution 17 - node.jsJuan sebastian HernadezView Answer on Stackoverflow