2011-09-02 9 views
20

Ho un codice come questo che renderà un modello di giada senza un percorso definito. Pensa a questo come express.static ma chiama res.render con l'url.Come posso rilevare un errore di rendering/modello mancante in node.js usando express.js?

app.use(function (req, res, next) { 
    try { 
     res.render(req.url.substring(1), { title: "No Controller", user: req.session.user }); 
    } catch (err) { 
     console.log(err) 
     next(); 
    } 
}); 

Il problema è che res.render() non sta generando un errore. Invece sta visualizzando una pagina di errore. C'è un modo per rilevare un modello mancante o errori di rendering?

risposta

39

Un modo migliore per farlo, invece di richiedere fs e avere un altro richiamo, sarebbe quella di utilizzare richiamata di rendere:

res.render(my_page_im_not_sure_it_exists, {}, function(err, html) { 
    if(err) { 
     res.redirect('/404'); // File doesn't exist 
    } else { 
     res.send(html); 
    } 
}); 
+4

Grande scoperta. È solo in 3.x doc, ma funziona anche in 2.x. – respectTheCode

+1

Risposta aggiornata per usare 'res.send' invece di' res.end'. 4.x documentazione [stati specifici] (http://expressjs.com/api.html#res.end) "Se è necessario rispondere con i dati, utilizzare metodi come res.send()" –

+1

Ho pensato che sarebbe genera un 404 se si è verificato un errore nell'elaborazione del modello, ma non sembra. Qualcuno si preoccupa di spiegare perché non lo fa? –

0

È possibile utilizzare fs.open per verificare se il modello esiste.

app.use(function (req, res, next) { 
    fs.open(__dirname + '/views/' + req.url.substring(1) + '.jade', 'r', function (err) { 
     if(err) { 
     console.log(err); 
     return next(); 
     } 
     res.render(req.url.substring(1), { title: "No Controller", user: req.session.user }); 
    } 
}); 
+0

res.render ha un po 'di logica per capire quale file di jade utilizzare. Speravo che non avrei avuto bisogno di ricreare quella logica. – respectTheCode

1

Simile alla risposta di @Augustin Riedinger, lo stesso vale durante il rendering alla variabile utilizzando renderFile:

var html = jade.renderFile('path/to/file.jade', context, function(err, html) {}; 
Problemi correlati