UNPKG

express-out-type

Version:

Middleware to intercept res.render to output raw template, locals ou current function

102 lines (77 loc) 2.15 kB
var path = require('path'); var fs = require('fs'); module.exports = function(req, res, next) { var render = res.render; res.render = function(view, locals, callback) { if ( req.query.out == 'script' ) { //endsWith ? res.render(__filename);} res.setHeader('content-type', 'text/javascript'); var fx = function(x) { try { if ( x.caller ) return fx( x.caller ) else return x; } catch(err) { return x; } } //res.send(arguments.callee.caller.caller.caller.toString()); res.send(fx(arguments.callee).toString()); } else if ( req.query.out == 'json' ) { res.setHeader('content-type', 'application/json'); res.json(res.locals); } else if ( req.query.out == 'template' ) { var fx = function(x) { var n = 0; var recursive = function(x) { n++; try { if ( x.caller ) return recursive( x.caller ) else return x; } catch(err) { return x; } } recursive(x); return n; } var n = fx(arguments.callee); var filename = _getCallerFile(n); // --- x --- var views = req.app.get('views'); var routes = path.resolve(views + '/../routes'); var relative = filename.substring(routes.length + 1); var relative = relative.slice(0, -3); var relative = relative.replace(/\\/g, '/'); var relative = relative + '.html'; var absolute = path.join(views, relative); var s = fs.readFileSync(absolute, 'utf8'); res.setHeader('content-type', 'text/html'); res.send(s); } else render.call(res, view, locals, callback); } next(); } function _getCallerFile(n) { try { var err = new Error(); var callerfile; var currentfile; Error.prepareStackTrace = function (err, stack) { return stack; }; currentfile = err.stack.shift().getFileName(); for (var i = 0; i < n; i++) { callerfile = err.stack.shift().getFileName(); } return callerfile; } catch (err) {} return undefined; }