2016-04-25 14 views
5

In app.js, hoCome lanciare un errore 404 in express.js?

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

quindi se chiedo un po 'non esiste URL del tipo http://localhost/notfound, sopra il codice verrà eseguito.

In esistono URL come http://localhost/posts/:postId, vorrei lanciare 404 errore quando l'accesso non esiste postId o postId cancellato.

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
    .then(function(post) { 
    if(!post) { 
     // How to throw a 404 error, so code can jump to above 404 catch? 
    } 
+0

È questo 'Posts.findOne' chiamato all'interno di una richiesta di pagina o di una promessa all'interno di una richiesta di pagina? –

risposta

3

In Express, a 404 isn't classed as an 'error', so to speak - il ragionamento alla base di questo è che un 404 non è di solito un segno che qualcosa che è andato storto, è solo che il server non è riuscito a trovare nulla. La cosa migliore è quello di inviare in modo esplicito un 404 nel gestore di percorso:

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
    .then(function(post) { 
    if(!post) { 
     res.status(404).send("Not found."); 
    } 

Oppure, in alternativa, se questo si sente come il codice troppo ripetuto, si può sempre tirare quel codice fuori in una funzione:

function notFound(res) { 
    res.status(404).send("Not found."); 
} 

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
     .then(function(post) { 
     if(!post) { 
      notFound(res); 
     } 

Non mi consiglia di utilizzare un middleware in questa situazione solo perché ritengo che il codice sia meno chiaro - il 404 è il risultato diretto del codice del database che non trova nulla, quindi ha senso avere la risposta nel gestore di route .

0

È possibile utilizzare questo e la fine dei vostri router.

app.use('/', my_router); 
.... 
app.use('/', my_router); 

app.use(function(req, res, next) { 
     res.status(404).render('error/404.html'); 
    }); 
2

mi hanno la stessa struttura app.js, e ho risolto questo problema in questo modo nel gestore percorso:

router.get('/something/:postId', function(req, res, next){ 
    // ... 
    if (!post){ 
     next(); 
     return; 
    } 
    res.send('Post exists!'); // display post somehow 
}); 

La funzione next() chiamerà il middleware successivo che è il gestore error404 se è giusto dopo i tuoi percorsi nell'app.js.