Roger
Roger

Reputation: 21

How do I automatically return a 404 when a GET path doesn't exist?

I am using NodeJS, Express and Handlebars (template engine) to build a web application. Currently I'm trying to automatically redirect users whenever they enter an URL that does not exist (or whenever they might not have access to it).

The following returns the index page:

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

But how do I make something like this:

router.get('/:ThisCouldBeAnything', (req, res) => {
    res.render('errors/404');
});

The following example is from Github:

Say that I enter this URL:

https://github.com/thispagedoesnotexist

It automatically returns a 404. How do I implement this in my application?

Thanks in advance.

Upvotes: 2

Views: 2791

Answers (3)

Aaron Pettengill
Aaron Pettengill

Reputation: 71

After all your other routes you can add:

app.get('*', (req, res) => {
  res.render('errors/404');
});

Alternately, you can use a middleware function after all your other middleware and routes.

app.use((req, res) => {
  res.render('errors/404');
});

So you might end up with something that looks like:

//body-parser, cookie-parser, and other middleware etc up here

//routes
app.get('/route1', (req, res) => {
  res.render('route1');
});

app.get('/route2', (req, res) => {
  res.render('route2');
});

//404 handling as absolute last thing
//You can use middleware
app.use((req, res) => {
  res.render('errors/404');
});

//Or a catch-all route
app.get('*', (req, res) => {
  res.render('errors/404');
});

Upvotes: 1

Andrew Gill
Andrew Gill

Reputation: 1

I see that you have express tagged. All you have to do is include a default handler that includes

res.status(404).render('404template')

For example

app.get('*', (req, res,next) => {
     res.status(404).render('error.ejs')
});

Upvotes: 0

YouneL
YouneL

Reputation: 8371

Use a middleware just after all route handlers to catch non existing routes:

app.get('/some/route', function (req, res) {
    ...
});

app.post('/some/other/route', function (req, res) {
    ...
});

...

// middleware to catch non-existing routes
app.use( function(req, res, next) {

    // you can do what ever you want here
    // for example rendering a page with '404 Not Found'
    res.status(404)
    res.render('error', { error: 'Not Found'});

});

Upvotes: 4

Related Questions