2011-09-02 12 views
20

Tengo un código como este que renderizará una plantilla de jade sin una ruta definida. Piense en esto como el express.static pero llama a res.render con la url.¿Cómo puedo detectar un error de representación/plantilla faltante en 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(); 
    } 
}); 

El problema es que res.render() no está arrojando un error. En cambio, está representando una página de error. ¿Hay alguna forma de detectar una plantilla faltante o algún error de representación?

Respuesta

39

Una mejor manera de hacerlo, en lugar de exigir fs y tener otro devolución de llamada, sería el uso de render de devolución de llamada:

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

Great find. Está solo en documentos 3.x pero funciona en 2.x también. – respectTheCode

+1

Respuesta actualizada para usar 'res.send' en lugar de' res.end'. 4.x documentación [especifica estados] (http://expressjs.com/api.html#res.end) "Si necesita responder con datos, utilice métodos como res.send()" –

+1

. Pensé que esto generar un 404 si hubo un error al procesar la plantilla, pero parece que no. ¿Alguien quiere explicar por qué no? –

0

Puede usar fs.open para verificar si existe la plantilla.

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 tiene un montón de lógica para averiguar qué archivo de jade usar. Esperaba que no necesitaría volver a crear esa lógica. – respectTheCode

1

Similar a la respuesta de @Augustin Riedinger, lo mismo se aplica cuando se representa a la variable usando renderFile:

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