UXWill
UXWill

Reputation: 199

Custom 404 page with Express.js

I'm trying to redirect to an html page when a 404 error is thrown. I have a folder titled: 404 in my public folder. Here is the code in the index.js:

var express = require('express');
var app = express();

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

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

res.sendFile(__dirname+'/public/html/contacts.html')


})

app.use(function(req, res, next){

// res.type('txt').send('Not found');
// res.status(404).end('error');

  if (req.accepts('html')) {
    res.render('404', { url: req.url });
    return;
  }

});



var server = app.listen(8000, function(){

console.log("Server is happening %s", server.address().port);

});

But I get the following error:

Error: No default engine was specified and no extension was provided. at new View (/home/pi/server/node_modules/express/lib/view.js:62:11) at EventEmitter.render (/home/pi/server/node_modules/express/lib/application.js:569:12) at ServerResponse.render (/home/pi/server/node_modules/express/lib/response.js:961:7) at /home/pi/server/index.js:19:9 at Layer.handle [as handle_request] (/home/pi/server/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/home/pi/server/node_modules/express/lib/router/index.js:312:13) at /home/pi/server/node_modules/express/lib/router/index.js:280:7 at Function.process_params (/home/pi/server/node_modules/express/lib/router/index.js:330:12) at next (/home/pi/server/node_modules/express/lib/router/index.js:271:10) at SendStream.error (/home/pi/server/node_modules/express/node_modules/serve-static/index.js:120:7) Error: No default engine was specified and no extension was provided. at new View (/home/pi/server/node_modules/express/lib/view.js:62:11) at EventEmitter.render (/home/pi/server/node_modules/express/lib/application.js:569:12) at ServerResponse.render (/home/pi/server/node_modules/express/lib/response.js:961:7) at /home/pi/server/index.js:19:9 at Layer.handle [as handle_request] (/home/pi/server/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/home/pi/server/node_modules/express/lib/router/index.js:312:13) at /home/pi/server/node_modules/express/lib/router/index.js:280:7 at Function.process_params (/home/pi/server/node_modules/express/lib/router/index.js:330:12) at next (/home/pi/server/node_modules/express/lib/router/index.js:271:10) at SendStream.error (/home/pi/server/node_modules/express/node_modules/serve-static/index.js:120:7)

Upvotes: 2

Views: 6506

Answers (3)

Ilio Catallo
Ilio Catallo

Reputation: 3180

In case you can adapt your 404 page to be a static page, you can simply do (from express docs):

res.status(404).sendFile('/path/to/404.html');

Conversely, if you want to have some view model object to be rendered (e.g., {url: req.url}), you have to decide for a template engine (e.g., Jade, EJS, Handlebars). As an example, assuming you want to use jade, you first install it as a dependency:

npm install jade

Then, you should add the following lines at the beginning of your script:

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

Once the template engine is in place, you can do:

res.render('viewName', viewModelObject)

and the viewName will be resolved as ./private/view/path/viewName.jade. Hence, assuming the existence of ./private/view/path/404.jade, you can do:

res.render('404', { url: req.url });

Please remember to keep your templates (i.e., your .jade files) somewhere inaccessible to the user.

Upvotes: 3

murshid_Dev
murshid_Dev

Reputation: 29

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

Upvotes: -1

Hiren S.
Hiren S.

Reputation: 2832

for response.render method, you have to use template engine like ejs.

and you have to setup view options.

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

But if you have put 404 file in public folder, then you can simply use sendfile or redirect to static path.

Upvotes: 0

Related Questions