Search code examples
node.jsexpressnode.js-connect

Cascade-like rendering with Express JS


With an express app running on a node server, how would I go about recursively searching for a render file from the full path right back to the beginning of the supplied URL.

For example, if someone was to hit my server with www.somewebsite.com/shop/products/product, the render engine would first check that there is an index.jade file in shop/products/product/. If none is found it would then check shop/products/, and subsequently shop/.

var express = require('express');

var app = express();

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

    res.render(req.path + '/index.jade', function(err, html){

        // some loopback code which alters the path and recalls the render method    

    })
});

The problem is that the response object is not passed to the render callback, so I'm unable to recall render on the response. I'm looking to create a loop because the URL paths may be any number of directories deep, so I can't just assume I only need to cascade for a definitive number of times.

Anyone see a way round this?


Solution

  • You should be able to use the response object from the closure. I think (assuming express allows you to call res.render a second time) you could use code like this answer to achieve what you want:

    var express = require('express');
    
    var app = express();
    
    app.get('/*', tryRender);
    
    function tryRender(req, res){
    
        res.render(req.path + '/index.jade', function(err, html){
    
            if (err) {
                req.path = 'mynewpath';
                tryRender(req, res);
            }    
    
        })
    }
    

    Note: You will need to add a base case or this function will recurse infinitely if it doesn't find a view that works :D

    In the event that express doesn't allow a subsequent call to res.render, you'll probably need to find out if the file exists on the file system yourself.