express-out-type
Version:
Middleware to intercept res.render to output raw template, locals ou current function
102 lines (77 loc) • 2.15 kB
JavaScript
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;
}